metaclass是type的子类

metaclass是type的子类

Question #

Python类型模型的三条原则之三: metaclass 是 type 的子类,通过替换 type 的__call__运算符重载机制,“超越变形”正常的类。如何理解原则三?

Answer #

正是 Python 的类创建机制,给了 metaclass 大展身手的机会。一旦你把一个类型 MyClass 的 metaclass 设置成 MyMeta,MyClass 就不再由原生的 type 创建,而是会调用 MyMeta 的__call__运算符重载。

class = type(classname, superclasses, attributedict)
# 变为了
class = MyMeta(classname, superclasses, attributedict)

所以,我们才能在上面 YAML 的例子中,利用 YAMLObjectMetaclass 的__init__方法,为所有 YAMLObject 子类偷偷执行add_constructor()。

Viewpoint #

JavaScript中通过修改prototype继承链条,也能实现对基础类的改造?(TODO:找资料证实,添加链接)

From #

18 | metaclass,是潘多拉魔盒还是阿拉丁神灯?

Python Data Model