`__metaclass__ = type`的目的是什么?

时间:2013-09-01 02:01:57

标签: python packages python-2.x metaclass

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__被分配到更高的范围,则此分配将恢复为默认值,但我看不到这样的分配。)它的目的是什么?

2 个答案:

答案 0 :(得分:11)

在Python 2中,声明__metaclass__ = type生成声明,否则将创建旧式类而不是创建新式类。只有旧式类使用模块级__metaclass__声明。新式类从其基类继承其元类(例如object),除非__metaclass__作为类变量提供。

声明实际上并未在您链接到上面的代码中使用(__init__.py文件中没有类声明),但它可能是。我怀疑它是作为一些样板文件的一部分包含在内,使Python 2代码更像Python 3(所有类都是新式的)。

答案 1 :(得分:0)

是的,它没有效果。这可能只是来自flufl.enum的作者的误解,或者是之前代码的遗留问题。

“superpackage”__metaclass__声明无效,因为没有Python超级包这样的东西。