如果 __metaclass__ 是类属性,它如何控制类的生成?
Posted
技术标签:
【中文标题】如果 __metaclass__ 是类属性,它如何控制类的生成?【英文标题】:If __metaclass__ is a class attribute, how does it control the generation of the class? 【发布时间】:2021-07-19 20:48:39 【问题描述】:我们知道在Python2中生成类的时候,如果有metaclass属性,就会由该属性引用的metaclass生成。类不生成时的Bug,应该是没有属性的,怎么控制类的生成?
【问题讨论】:
什么意思,“控制生成”? 【参考方案1】:因为类定义语句的主体是在创建类对象之前评估的。
确实,该类没有该属性,该类甚至还不存在。但是类定义语句已经被评估了。
【讨论】:
【参考方案2】:Python 实现本身首先收集在class
语句的命名空间中定义的名称,然后生成对元类的调用,并将这些名称作为映射参数传递给元类。也就是说,像
class Foo:
x = 3
用于生成等价于
的东西Foo = type('Foo', (), 'x': 3)
type
是默认的元类。
当名称空间中遇到名称__metaclass__
时,实现使用该值作为元类而不是type
。
class Foo:
__metaclass__ = Bar
变成(大致)
Foo = Bar('Foo', (), '__metaclass__': Bar).
(我故意忽略Foo
缺少显式基类。我不完全理解带有指定__metaclass__
的看似旧式类与“纯”旧式类有何不同或另一个新式类,但任何差异似乎与手头的问题无关。)
【讨论】:
以上是关于如果 __metaclass__ 是类属性,它如何控制类的生成?的主要内容,如果未能解决你的问题,请参考以下文章
35.Python面向对象元类:type()__metaclass__属性实现简易ORM框架
35.Python面向对象元类:type()__metaclass__属性实现简易ORM框架