方法解析顺序和元类

Method resolution order and metaclasses

为什么元类没有出现在 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 在这种情况下使用什么算法?

因为您的 class 中的 none 源自元 class。元class 不是基础class。 metaclass 是 生产 Bar class 对象的工厂,就像 class 对象生产实例一样。

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

元class 在查找属性时排在最后;因此 Bar.spam 将首先在 MRO 中查找,然后 然后 type(Bar).

当然,metaclasses 也使用继承层次结构; Foo 派生自 type 在您的示例中。这种关系也使用 MRO。