如果 __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__ 是类属性,它如何控制类的生成?的主要内容,如果未能解决你的问题,请参考以下文章

__metaclass__ 向创建的类添加无效属性?

python学习笔记1-元类__metaclass__

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

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

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

Python type class metaclass