metaclass文章集: http://www.mantingzhou.com/subject/40/
python的metaclass晦涩难懂,本文通过调试工具展示metaclass构建类的过程。
Python使用type()构建类(新式类),构建过程是先读入类定义到一个独立的命名空间,接着调用type(name, bases, dict)生成新的类对象,最后把生成类对象绑定到类名(type参数name)。
读入类定义时,如果类定义中存在__metaclass__,将使用__metaclass__的值替代type()。__metaclass__的值是可调用对象(callable object,类或函数),可用于监视和修改类创建过程:
- 在类创建之前修改类字典。
- 返回其他类实例。
上述过程一般在metaclass的__new__()方法中执行。
无__metaclass__构建过程:
1~6读入(1进入,6跳出)。
7~11构建类实例(7~9创建类实例,9~11初始化类实例)。
Python解释器读入包含__metaclass__的类后,紧接着依次调用__metaclass__的__new__()、__init__(),修改类对象。
有__metaclass__构建过程:
1~4读入metacls.
5~11读入klass.
12~15修改klass.
16~20构建类实例.