美文网首页
python中元类

python中元类

作者: IT入门指南 | 来源:发表于2019-04-12 11:32 被阅读0次

    小小的提示

    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()
    
    

    相关文章

      网友评论

          本文标题:python中元类

          本文链接:https://www.haomeiwen.com/subject/omoqwqtx.html