10

Python(仅限 2?)查看变量的值__metaclass__以确定如何type从类定义中创建对象。可以__metaclass__在模块或包级别定义,在这种情况下,它适用于该模块中的所有后续类定义。

flufl.enum但是,我在包中遇到了以下内容__init__.py

__metaclass__ = type

由于默认元类 if__metaclass__未定义 is type,这不会没有效果吗?__metaclass__(如果分配到更高的范围,此分配将恢复为默认值,但我看不到这样的分配。)它的目的是什么?

4

2 回答 2

13

在 Python 2 中,声明__metaclass__ = type使原本会创建旧式类的声明改为创建新式类。只有旧式类使用模块级__metaclass__声明。除非作为类变量提供,否则新式类从它们的基类(例如object)继承它们的元类。__metaclass__

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

于 2013-09-01T02:32:19.263 回答
0

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

“超级包”__metaclass__声明将没有任何效果,因为没有 Python 超级包之类的东西。

于 2013-09-01T02:16:45.530 回答