方法解析顺序和元类



元类为什么不出现在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类对象的工厂,就像类对象生成实例一样。

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

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

当然,元类也使用继承层次结构;Foo是从您的示例中的type派生而来的。这种关系也使用MRO。

相关内容

  • 没有找到相关文章

最新更新