用户自定义类是type类的__call__运算符重载

用户自定义类是type类的__call__运算符重载

Question #

Python类型模型的三条原则之二: 用户自定义类,只不过是 type 类的__call__运算符重载。如何理解这条规则?

Answer #

当我们定义一个类的语句结束时,真正发生的情况,是 Python 调用 type 的__call__运算符。简单来说,当你定义一个类时,写成下面这样时:

class MyClass:
  data = 1

Python 真正执行的是下面这段代码:

class = type(classname, superclasses, attributedict)

这里等号右边的type(classname, superclasses, attributedict),就是 type 的__call__运算符重载,它会进一步调用:

type.__new__(typeclass, classname, superclasses, attributedict)
type.__init__(class, classname, superclasses, attributedict)

当然,这一切都可以通过代码验证,比如下面这段代码示例:

class MyClass:
  data = 1

instance = MyClass()
MyClass, instance
# 输出
(__main__.MyClass, <__main__.MyClass instance at 0x7fe4f0b00ab8>)
instance.data
# 输出
1
MyClass = type('MyClass', (), {'data': 1})
instance = MyClass()
MyClass, instance
# 输出
(__main__.MyClass, <__main__.MyClass at 0x7fe4f0aea5d0>)
instance.data
# 输出
1

由此可见,正常的 MyClass 定义,和你手工去调用 type 运算符的结果是完全一样的。

From #

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

Python Data Model 所有的Python用户自定义类,都是type这个类的实例