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在这种情况下使用什么算法呢?
因为没有你的类派生从元类.元类不是基类.元类是,该工厂产生的Bar类对象,就像一个类对象生成实例.
这里不需要线性化.Bar是类型的对象Foo,就像其他类是类型一样type.任何子类Bar都具有相同的类型(元类); 他们直接有这种关系.一个类一次只能有一个元类.
查找属性时,元类最后出现; 所以Bar.spam将首先在MRO来寻找,只有再上type(Bar).
当然,元类也使用继承层次结构; Foo源于type你的例子.这种关系也使用了MRO.
| 归档时间: |
|
| 查看次数: |
431 次 |
| 最近记录: |