关于元类的一些使用心得

作廖老师的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__方法初始化类对象

当元类存在时,并不是直接根据类的描述创建实例对象,而是拦截类的实例化。然后根据元类动态修改类的描述,最后根据修改后的类描述来创建对象。

原文地址:https://www.cnblogs.com/weixia-blog/p/7339833.html