`__metaclass__ = type` 的目的是啥?

Posted

技术标签:

【中文标题】`__metaclass__ = type` 的目的是啥?【英文标题】:What is the purpose of `__metaclass__ = type`?`__metaclass__ = type` 的目的是什么? 【发布时间】:2013-09-04 11:01:25 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于`__metaclass__ = type` 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

metaclass

35.Python面向对象元类:type()__metaclass__属性实现简易ORM框架

35.Python面向对象元类:type()__metaclass__属性实现简易ORM框架

35.Python面向对象元类:type()__metaclass__属性实现简易ORM框架

python学习笔记1-元类__metaclass__

metaclass元类解析