方法解析顺序和元类

时间:2016-05-14 14:39:05

标签: python metaclass method-resolution-order

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

1 个答案:

答案 0 :(得分:6)

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

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

查找属性时,元类最后出现;因此,首先会在MRO中查找Bar.spam,而type(Bar)上只有然后

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