作廖老师的Python实战作业时,对元类这个魔法方法有些小心得。
元类这个黑魔法和linux中root都是bug般的存在,不想纠缠概念性东西,试着从Python解释器的角度分析下元类的执行过程。
其实,元类的主要作用尽在这三句话中:
1.拦截类的创建
2.修改类
3.返回修改后的类
普通类调用__new__方法产生实例对象,而元类通过type.__new__创建新的类。
1 class ModelMetaclass(type): 2 #采集应用元类的子类属性信息 3 #将采集的信息作为参数传入__new__方法 4 #应用__new__方法修改类 5 def __new__(cls,name,bases,attrs): 6 ... 7 return type.__new__(cls,name,bases,attrs)
1 class Model(dict,metaclass=ModelMetaclass): 2 ...
我们定义一个元类ModelMetaclass和一个应用元类的Model类。
1 model = Model(**kw)
当我们用Model类创建一个model实例对象,python解释器执行过程如下:
1.发现元类
2.应用元类。通过元类的__new__创建类对象,__new__方法首先从Model类的类定义中搜集属性和方法信息作为字典数据传入__new__的attrs参数中;用户对收集的信息删减增添修改,生成新的attrs参数;调用type.__new__方法,并把新的attrs参数传入该方法中,即返回一个新的类对象。
3.如果存在__init__方法,在第二步即生成类对象后调用__init__方法初始化类对象
当元类存在时,并不是直接根据类的描述创建实例对象,而是拦截类的实例化。然后根据元类动态修改类的描述,最后根据修改后的类描述来创建对象。