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