Python 2.3中该类层次的旧风格与新风格类MRO是否一致?
旧风格类与新风格类的MRO是否相同?
答案是不相同,Python 2.3中旧风格(经典)类和新风格类使用完全不同的方法解析顺序算法,针对你给出的类层次,两者的MRO结果差异很明显。
先回顾你给出的类定义:
>>> O = object >>> class F(O): pass >>> class E(O): pass >>> class D(O): pass >>> class C(D,F): pass >>> class B(E,D): pass >>> class A(B,C): pass
1. 旧风格类的MRO(深度优先遍历)
旧风格类(Python 2中未显式继承object的类)使用深度优先、从左到右的遍历规则——简单来说就是先完整遍历第一个父类的整个继承链,再遍历第二个父类的链,遇到重复的类时跳过已经出现过的。
针对类A,旧风格的MRO结果为:A → B → E → D → O → C → F
(注:旧风格类没有内置的mro()方法,可通过inspect.getmro(A)获取该顺序)
2. 新风格类的MRO(C3线性化算法)
新风格类(也就是你代码中显式继承object的类)使用C3线性化算法,这个算法的核心目标是:
- 保证子类永远在父类之前
- 严格保持父类列表的声明顺序
- 避免重复类,同时解决多继承(尤其是钻石继承)场景下的方法查找歧义
通过C3算法计算,类A的MRO结果为:A → B → E → C → D → F → O
你可以直接调用A.mro()验证这个结果,Python 2.3及以后的新风格类支持这个方法。
核心差异对比
对比两个顺序能看到明显不同:
- 旧风格中
D和O出现在C之前,而新风格中C被提前到D之前 - 旧风格中
F是最后一个,新风格中F在D之后、O之前
这种差异是因为C3算法会优先保证父类的声明顺序,同时避免深度优先带来的继承链歧义,而旧风格的简单深度优先在复杂多继承场景下可能导致意想不到的方法查找顺序。
内容的提问来源于stack exchange,提问作者OfirD
相关产品推荐
相关产品推荐

