python中元类

2019-04-12  本文已影响0人  IT入门指南

小小的提示

python中一切皆是对象
python中类也是对象
python 中可以通过type来创建一个类对象
my_class = type("MyClass", (),  {})
元类就是用来创建简单易用的api, 隐藏具体繁琐的实现细节
元类的操作就是动态的拦截类,修改类,然后返回修改之后的类
ps:在python中动态的修改创建的类 可以使用类装饰器
在python 类的创建寻找元类的顺序 
1 当前类中是否有_metaclass_属性, 如果有则通过_metaclass_指定
的元类来创建改类,
2 如果没有, 寻找父类,
3 如果所有的父类没有找到,使用系统自带的type来创建该类

实际的例子

class Field:
    def __init__(self, default_value):
        self.default_value = default_value


class StringField(Field):
    def __init__(self, default_value):
        super(StringField, self).__init__(default_value)


class IntegerField(Field):
    def __init__(self, default_value):
        super(IntegerField, self).__init__(default_value)


class MetaClass(type):
    def __new__(cls, cls_name, cls_attr, cls_dict, **kwargs):
        if 'Model' == cls_name:
            return type.__new__(cls, cls_name, cls_attr, cls_dict, **kwargs)
        mapping = dict()

        for k, v in cls_dict.items():
            if isinstance(v, Field):
                mapping[k] = v
        for k in mapping.keys():
            cls_dict.pop(k)

        cls_dict['__mapping__'] = mapping
        cls_dict['__table__'] = cls_name
        return type.__new__(cls, cls_name, cls_attr, cls_dict, **kwargs)


class Model(metaclass=MetaClass):
    def __init__(self, **kwargs):
        super(Model, self).__init__(**kwargs)

    def __getattr__(self, item):
        return self[item]

    def __setattr__(self, key, value):
        self[key] = value

    def save(self):
        for k, v in self.__mapping__.items():
            print(v.default_value)


class User(Model):
    name = StringField(default_value="user_name")
    age = IntegerField(default_value=10)


user = User()
user.save()

上一篇 下一篇

猜你喜欢

热点阅读