python继承的核心逻辑是通过mro动态查找方法,单继承为线性结构,多继承用c3算法合并mro;super()按mro向后查找;应遵循“is-a”关系,优先组合而非多继承。

Python继承的核心逻辑
Python中的继承不是简单地“复制父类代码”,而是通过方法解析顺序(MRO)动态决定调用哪个类的方法。子类实例在调用一个方法时,会按MRO列表从左到右查找,找到第一个匹配即停止。理解MRO是掌握单继承和多继承的关键。
单继承:清晰的线性查找链
单继承下MRO就是“子类 → 父类 → object”的线性结构,行为可预测。比如:
class Animal: pass
class Dog(Animal): pass
print(Dog.__mro__) # (
- 调用
Dog().say()时,先查Dog,再查Animal,最后查object - 重写父类方法时,可用
super()调用父类实现,避免硬编码父类名 - 子类可直接访问父类的公有属性和方法,但不能访问以双下划线开头的私有成员(如
__name会被名称改写)
多继承:C3线性化算法决定MRO
Python采用C3算法合并多个父类的MRO,确保每个祖先类只出现一次,且保持各父类原有的相对顺序。例如:
class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass
print(D.__mro__) # D → B → C → A → object
- 如果B和C都定义了同名方法,D中未重写,则按MRO顺序调用B的方法(因B在C前)
- 使用
super()在多继承中依然有效,它按MRO继续向后查找,不是简单调用直接父类 - 若父类间存在冲突(如不同父类继承自同一祖父类但路径不一致),Python会在类定义时报
TypeError,强制开发者显式解决
实用建议与常见陷阱
继承应服务于“is-a”关系建模,而非代码复用首选。过度依赖多继承易导致MRO难追踪、语义模糊。
- 用
ClassName.__mro__或help(ClassName)随时查看实际解析顺序 - 避免在多继承中让两个父类都实现同一个方法却无明确职责划分
- 优先考虑组合(has-a)代替继承(is-a),例如用属性引用其他对象,而非强行拉进继承链
- 构造函数中若需初始化多个父类,应在每个父类的
__init__里都调用super().__init__(),形成协作调用链










