Python方法解析顺序(MRO)原理及代码输出解析
Python 方法解析顺序(MRO)工作机制与代码输出解析
一、MRO核心逻辑
Python的MRO是多继承场景下方法/属性的查找规则,基于C3线性化算法实现,核心目标是:
- 保证每个类仅被访问一次
- 遵循子类优先于父类的原则
- 尊重子类继承列表中父类的声明顺序
- 解决菱形继承(多个子类继承同一父类)的歧义问题
二、示例代码、继承关系与输出分析
示例代码
class Base: def func(self): print("Base.func()") class Left(Base): def func(self): print("Left.func()") class Right(Base): def func(self): print("Right.func()") class Derived(Left, Right): pass obj = Derived() obj.func()
继承关系图
Base / \ Left Right \ / Derived
运行输出
Left.func()
输出原因
调用obj.func()时,Python会按照Derived类的MRO顺序查找方法:
- 先检查
Derived自身,无func方法 - 接着检查
Left,找到func方法并执行,终止查找
你可以通过以下命令查看Derived类的MRO顺序:
print(Derived.mro()) # 输出: [<class '__main__.Derived'>, <class '__main__.Left'>, <class '__main__.Right'>, <class '__main__.Base'>, <class 'object'>]
三、C3线性化算法的关键规则
- 子类优先:子类的位置始终在所有父类之前
- 顺序保留:继承列表中父类的声明顺序会被保留在MRO中
- 单调性:如果类X在类Y的MRO中出现在Z之前,那么在所有包含X、Y、Z的MRO中,X都在Z之前
四、学习资源建议
- 深入阅读Python官方文档中关于MRO的说明,理解C3算法的推导过程
- 编写不同继承结构的测试代码,打印MRO并对比方法查找结果
- 分析复杂多继承场景(如多层嵌套继承)的MRO路径,巩固理解
内容的提问来源于stack exchange,提问作者Vikalp Jain
相关产品推荐
相关产品推荐

