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