元类为什么不出现在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在这种情况下使用了什么算法呢?
因为您的类都不是从元类派生的。元类是而不是基类。元类是生成Bar
类对象的工厂,就像类对象生成实例一样。
这里不需要线性化。Bar
是Foo
类型的对象,就像其他类是type
类型一样。Bar
的任何子类都将具有相同的类型(元类);它们直接具有这种关系。一个类一次只能有一个元类。
元类在查找属性时排在最后;因此将首先在MRO中查找Bar.spam
,并且在type(Bar)
上仅查找然后查找。
当然,元类也使用继承层次结构;Foo
是从您的示例中的type
派生而来的。这种关系也使用MRO。