python多继承中的方法解析顺序(mro)是通过c3线性化算法确定的类查找序列,确保子类优先、父类顺序保持、单调性;可用__mro__属性或mro()方法查看,同名方法调用mro中靠前的版本。

Python多继承中的方法解析顺序(MRO)是什么
当一个类同时继承多个父类时,Python需要明确调用某个方法时该从哪个父类开始查找。这个查找路径就是方法解析顺序(Method Resolution Order, MRO)。它不是简单按继承列表从左到右线性扫描,而是通过C3线性化算法生成一个确定的、无歧义的类序列。
C3线性化算法的核心规则
C3算法确保三个关键性质:子类优先于父类、各父类保持原有相对顺序、单调性(继承关系变化时MRO只增不乱)。其计算逻辑可简化为:
- 每个类的MRO是它自身 + 合并所有父类的MRO + 所有父类本身
- 合并时,取当前所有候选MRO序列的**头元素**;该元素必须不在任何候选序列的**尾部**中出现,否则跳过
- 重复此过程,直到所有类都被加入结果序列,或无法继续(此时报错TypeError)
查看和验证MRO的实用方法
直接访问类的__mro__属性或调用mro()方法,就能看到Python实际采用的解析顺序:
class A: pass class B: pass class C(A, B): pass print(C.__mro__) # 输出: (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
注意:即使object没显式写出,它始终是所有新式类的最终祖先,自动包含在MRO末尾。
立即学习“Python免费学习笔记(深入)”;
冲突场景与典型解决方案
当多个父类定义了同名方法,MRO决定最终调用哪一个——靠前的类的方法胜出。例如:
class A:
def show(self): print("A")
<p>class B:
def show(self): print("B")</p><p>class C(A, B):
pass</p><p>C().show() # 输出 "A",因为A在MRO中排B前面若想显式调用特定父类方法,可用super()配合MRO位置,或直接用类名调用:
- super(C, self).show() 按MRO下一个类找
- B.show(self) 绕过MRO,强制调用B的版本
但后者破坏封装,仅限特殊调试或底层控制场景使用。










