【发布时间】:2021-07-19 20:48:39
【问题描述】:
我们知道在Python2中生成类的时候,如果有metaclass属性,就会由该属性引用的metaclass生成。类不生成时的Bug,应该是没有属性的,怎么控制类的生成?
【问题讨论】:
-
什么意思,“控制生成”?
标签: python python-2.x metaclass
我们知道在Python2中生成类的时候,如果有metaclass属性,就会由该属性引用的metaclass生成。类不生成时的Bug,应该是没有属性的,怎么控制类的生成?
【问题讨论】:
标签: python python-2.x metaclass
因为类定义语句的主体是在创建类对象之前评估的。
确实,该类没有该属性,该类甚至还不存在。但是类定义语句已经被评估了。
【讨论】:
Python 实现本身首先收集在class 语句的命名空间中定义的名称,然后生成对元类的调用,并将这些名称作为映射参数传递给元类。也就是说,像
class Foo:
x = 3
用于生成等价于
的东西Foo = type('Foo', (), {'x': 3})
type 是默认的元类。
当名称空间中遇到名称__metaclass__ 时,实现使用该值作为元类而不是type。
class Foo:
__metaclass__ = Bar
变成(大致)
Foo = Bar('Foo', (), {'__metaclass__': Bar}).
(我故意忽略Foo 缺少显式基类。我不完全理解带有指定__metaclass__ 的看似旧式类与“纯”旧式类有何不同或另一个新式类,但任何差异似乎与手头的问题无关。)
【讨论】: