mro(方法解析顺序)是python确定多继承中方法调用路径的规则,采用c3线性化算法生成类继承链,确保子类优先、父类顺序保持及单调性;可通过__mro__或mro()查看,冲突时抛出typeerror。

什么是MRO以及为什么它重要
MRO(Method Resolution Order,方法解析顺序)是Python用于确定多继承中方法调用路径的规则。当一个类继承多个父类,且这些父类中存在同名方法时,Python需要明确“该调用哪一个”。MRO就是这个决策依据——它是一条线性化的类继承链,决定了属性和方法查找的先后顺序。
Python使用C3线性化算法计算MRO
Python 2.3之后统一采用C3线性化算法(而非早期的深度优先),确保MRO满足三个条件:子类优先、保持各父类原有顺序、单调性(即某个类在MRO中的位置不能比其父类更靠后)。你可以通过ClassName.__mro__或ClassName.mro()查看具体顺序。
-
示例:若定义
class D(B, C): pass,且B和C都继承自A,则D.mro()返回[D, B, C, A, object](不是[D, B, A, C, object]) - 如果某类的继承声明违反C3规则(比如无法构造出满足所有约束的线性序列),Python会在类定义时直接抛出
TypeError: Cannot create a consistent method resolution order (MRO)
常见冲突场景与排查技巧
冲突通常不表现为语法错误,而是运行时行为不符合预期——比如本该调用子类重写的方法,却意外触发了某个父类的实现。
- 检查
super().__init__()是否在所有父类构造函数中正确传递,避免漏调或重复调用 - 打印各相关类的
__mro__,对照确认目标方法实际落在哪一层 - 注意
super()的动态性:它不是简单地调上一级,而是按当前实例的MRO中「当前类之后」的第一个匹配项查找 - 避免在多重继承中让两个无关父类提供同名但语义不同的方法(如都定义
save()),这是设计层面的风险点
可控调整MRO的实用建议
不推荐强行绕过MRO,但可通过结构调整降低复杂度:
立即学习“Python免费学习笔记(深入)”;
- 优先使用组合代替多重继承,把共用逻辑封装为独立工具类或Mixin
- 若必须用多继承,让Mixin类只负责单一职责,并命名体现其定位(如
JSONSerializableMixin) - 显式调用特定父类方法(
B.method(self))仅在必要时使用,要清楚这会打破super()的协作链条 - 在类定义时留意继承括号内的顺序:
class Child(ParentA, ParentB):中ParentA在MRO中一定排在ParentB前面










