【问题标题】:If __metaclass__ is a class attribute, how does it control the generation of the class?如果 __metaclass__ 是类属性,它如何控制类的生成?
【发布时间】:2021-07-19 20:48:39
【问题描述】:

我们知道在Python2中生成类的时候,如果有metaclass属性,就会由该属性引用的metaclass生成。类不生成时的Bug,应该是没有属性的,怎么控制类的生成?

【问题讨论】:

  • 什么意思,“控制生成”?

标签: python python-2.x metaclass


【解决方案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__ 的看似旧式类与“纯”旧式类有何不同或另一个新式类,但任何差异似乎与手头的问题无关。)

    【讨论】:

      猜你喜欢
      • 2017-05-27
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 2022-12-07
      • 2020-10-04
      相关资源
      最近更新 更多