Python(仅限2个?)查看变量__metaclass__
的值,以确定如何从类定义创建type
对象。 It is possible to define __metaclass__
at the module or package level,在这种情况下,它适用于该模块中的所有后续类定义。
但是,我在flufl.enum
包的__init__.py
中遇到了以下内容:
__metaclass__ = type
由于未定义__metaclass__
的默认元类是type
,这不会有效吗? (如果__metaclass__
被分配到更高的范围,则此分配将恢复为默认值,但我看不到这样的分配。)它的目的是什么?
答案 0 :(得分:11)
在Python 2中,声明__metaclass__ = type
生成声明,否则将创建旧式类而不是创建新式类。只有旧式类使用模块级__metaclass__
声明。新式类从其基类继承其元类(例如object
),除非__metaclass__
作为类变量提供。
声明实际上并未在您链接到上面的代码中使用(__init__.py
文件中没有类声明),但它可能是。我怀疑它是作为一些样板文件的一部分包含在内,使Python 2代码更像Python 3(所有类都是新式的)。
答案 1 :(得分:0)
是的,它没有效果。这可能只是来自flufl.enum
的作者的误解,或者是之前代码的遗留问题。
“superpackage”__metaclass__
声明无效,因为没有Python超级包这样的东西。