mro(方法解析顺序)是python通过c3线性化算法计算出的类搜索优先级元组,确保每个类仅出现一次、子类在父类前、多父类顺序与声明一致;它决定super()查找起点和属性/方法调用路径。

Python多重继承的调用顺序由MRO(Method Resolution Order,方法解析顺序)决定,它不是简单按从左到右或深度优先排列,而是通过C3线性化算法严格计算得出的确定性序列。这个顺序直接影响 super() 的行为、同名方法的执行路径,以及属性查找过程。
什么是MRO?它为什么不能靠直觉猜
MRO是一个元组,表示类在方法查找时的搜索优先级列表。它确保:每个类只出现一次;子类永远排在父类前面;多个父类的相对顺序与其在类定义中声明的顺序一致。如果仅凭“谁写在左边就先调谁”来理解,容易在复杂继承链中出错——比如A继承B和C,而B和C又都继承D,这时D的位置必须唯一且靠后,不能重复出现。
C3线性化算法的核心规则
C3算法的目标是合并多个继承链,生成一个满足约束的扁平化顺序。它遵循三条关键原则:
- 子类始终排在所有父类之前
- 各父类的MRO顺序,严格按它们在类头中出现的位置从前到后合并
- 若某类在多个父类的MRO中重复出现,只保留最靠前的一次,其余全部跳过
如何查看和验证MRO
每个类都有内置属性 __mro__ 和方法 mro(),返回一个元组,清晰展示实际顺序:
立即学习“Python免费学习笔记(深入)”;
class A: passclass B: pass
class C(A, B): pass
print(C.__mro__)
# 输出: (
注意:即使A和B没有显式继承object,Python 3中所有类默认继承object,所以它总在MRO末尾。
super() 是怎么依赖MRO工作的
调用 super().method() 时,Python不会固定去某个父类找方法,而是从当前类在MRO中的下一个类开始向后查找。例如,在C中调用 super().foo(),会从A开始查;若A没有foo,则继续查B,再往后是object。
这意味着:super() 不等于 “调用第一个父类”,而是 “按MRO顺序调用下一个有该方法的类”。这也是为什么设计协作式多继承时,所有父类方法都应使用 super() 链式调用,否则链条可能提前中断。










