概述
metaclass在很多语言里都有,能够动态改变类的行为。
例子:简单模拟了一下Django ORM Model
Model 可以以下面的形式定义Field:
在Resource Model对象使用:
模拟代码:
Tips
这段代码重载了类的构造函数__init__
,在构造的时候会调用Field.validate
方法,并且把对象的属性赋值为validated之后的cleaned_data。
所以在调用print MyModel.age
打印的是Field Object,而MyModel()
对象输出的是100。
Tips:
metaclass通过收集当前类和基类的所有_do_开头的属性,放到当前类的_hook_funcs属性中,在基类调用钩子里的函数。
MetaClass的_hook_funcs是OrderedDict,因此同名hook函数覆盖.MetaClassAll使用list存储所以hook functions,因此不覆盖。