super()按mro(方法解析顺序)链查找方法,从当前类在mro元组中的位置之后的第一个类开始搜索,而非简单调用直接父类;需通过classname.__mro__验证实际顺序,所有参与类必须统一使用super()才能保证协作链完整。

super() 在多继承中到底按什么顺序找方法?
Python 多继承里 super() 不是简单地调上一级父类,而是严格遵循 MRO(Method Resolution Order)链。你写的 super().method() 会从当前类的 MRO 列表中,**当前类之后的第一个类**开始搜索该方法——不是按继承声明顺序,也不是按定义顺序。
查 MRO 最直接的方式是看 ClassName.__mro__,它返回一个 tuple,顺序就是实际查找路径。比如 class C(A, B): pass,C.__mro__ 通常是 (C, A, B, object),但若 A 和 B 本身也有共同父类(如都继承 object),MRO 会按 C3 线性化算法合并,可能变成 (C, A, B, Base, object)。
- 别靠“我以为 A 写在前面就先调 A”来设计逻辑,必须验证
__mro__ - 所有参与多继承的类,只要想被
super()链式调用,都得显式写super().xxx(),否则链会在那里断掉 - 如果某个父类没写
super(),后续类的方法根本不会被执行,哪怕它在 MRO 里靠后
为什么写了 super() 还报 AttributeError:'X' object has no attribute 'Y'?
典型症状是:子类调 super().init(),但某中间父类的 __init__ 里访问了还没初始化的属性,或者某个父类压根没实现该方法,而 MRO 下一个类也没有,最终走到 object 却发现 object 没这个属性或方法。
- 确保每个参与协作的父类方法签名一致(特别是参数名和默认值),否则
super().__init__(a, b)可能传错参给下一个类 - 避免在父类
__init__中直接访问子类才定义的属性;如需共享状态,用kwargs或提前设默认值 - 检查是不是某个父类漏写了该方法,又没做兜底(比如用
getattr(self, 'attr', None)替代直接访问)
如何安全地让多个父类的 __init__ 都执行且不重复传参?
最稳妥的做法是统一用 **kwargs 透传,并由各父类自己 pop 掉关心的参数。这样既解耦,又避免因参数顺序/数量变化导致崩溃。
class A:
def __init__(self, name=None, **kwargs):
super().__init__(**kwargs) # 继续往后传
self.name = name
<p>class B:
def <strong>init</strong>(self, age=None, <strong>kwargs):
super().<strong>init</strong>(</strong>kwargs)
self.age = age</p><p>class C(A, B):
def <strong>init</strong>(self, <strong>kwargs):
super().<strong>init</strong>(</strong>kwargs) # 自动分发到 A 和 B
</p>
- 所有父类构造函数必须接受
**kwargs并调用super().__init__(**kwargs) - 不要在某个类里把
**kwargs全部消费完,否则后面的类收不到任何参数 - 如果必须传位置参数,确保整个 MRO 链上所有类的参数顺序完全一致——极难维护,不推荐
什么时候不该用 super() 而该显式调用父类名?
只有两种合理场景适合绕过 super():一是明确只想调特定父类(比如 A.method()),且确定不需要走 MRO;二是某个父类完全不参与协作协议(比如只是混入一个工具方法,不涉及初始化链)。
- 显式写
A.__init__(self, ...)会跳过 MRO,直接进A,但A里的super()就不再指向B,而是A的下一个 MRO 类(可能是object) - 混入类(Mixin)如果只提供独立功能、不依赖其他父类状态,可以不用
super(),但一旦它需要和别的类共享初始化流程,就必须回归协作模式 - 最危险的是“一半用 super,一半用类名调用”,这会让 MRO 链断裂或重复执行,调试时极难追踪
真正难的不是语法,是设计时就要决定:这些父类是否构成一个协作契约。一旦选了 super(),所有参与者就得遵守同一套规则——少一个,整条链就失效。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











