方法解析顺序和元类

Val*_*ntz 2 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
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 6

因为没有你的类派生从元类.元类不是基类.元类是,该工厂产生的Bar类对象,就像一个类对象生成实例.

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

查找属性时,元类最后出现; 所以Bar.spam将首先在MRO来寻找,只有再上type(Bar).

当然,元类也使用继承层次结构; Foo源于type你的例子.这种关系也使用了MRO.