`__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` 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章
35.Python面向对象元类:type()__metaclass__属性实现简易ORM框架
35.Python面向对象元类:type()__metaclass__属性实现简易ORM框架