3

为什么元类没有出现在 MRO 中?

例如:

>>> class Foo(type):
...  foo = 21
... 
>>> class Bar(metaclass=Foo):
...  pass
... 
>>> Bar.mro()
[<class '__main__.Bar'>, <class 'object'>]
>>> Bar.foo
21

另外,我在其他地方看到 Python 使用 C3 线性化来计算 MRO,但这种线性化不处理元类。那么在这种情况下,Python 使用什么算法呢?

4

1 回答 1

6

因为您的所有类都不是从元类派生的。元类不是基类。元类是产生类对象的工厂,Bar就像类对象产生实例一样。

这里不需要线性化。Bar是类型的对象Foo,就像其他类是类型一样type。的任何子类都Bar将具有相同的类型(元类);他们直接有那种关系。一个类一次只能有一个元类。

查找属性时,元类排在最后;所以Bar.spam将首先在 MRO 中查找,然后才在type(Bar).

当然,元类也使用继承层次结构;Foo源自type您的示例。这种关系也使用 MRO。

于 2016-05-14T14:44:48.580 回答