真正的多重重写指在深度继承链中,子类逐层重写父类已重写的方法,如a→b→c中c重写b重写的method;其行为由mro动态决定,且需super()显式委托才能维持可扩展的调用链。

在 Python 类定义中,多重方法重写(Multiple Method Overriding)并不是指一个类同时重写多个父类的同名方法(那是多继承下的方法解析问题),而是指子类对从某个父类继承来的方法进行重新定义——当存在多层继承(如 A → B → C)时,C 类可覆盖 B 类已覆盖的 A 类方法,形成“重写链”。关键在于理解 方法解析顺序(MRO) 和 super() 的动态绑定机制,而非单纯语法层面的“多次重写”。
什么是真正的多重重写?
它发生在深度继承链中:父类定义方法 → 中间类重写 → 子类再次重写。例如:
A.method() → B.method() 重写了它 → C.method() 又重写了 B 的版本
此时 C.method() 并非直接覆盖 A 的原始实现,而是覆盖了 B 提供的版本。Python 不保留“原始方法快照”,每次调用都依据当前类的 MRO 动态查找。
MRO 决定谁的方法被实际调用
Python 使用 C3 线性化算法生成 MRO 列表,决定了属性/方法搜索顺序。可通过 C.mro() 查看。
- 即使 B 和 C 都重写了
method(),C().method()总是执行 C 类中的定义 - 若 C 中未定义,则按 MRO 向上查找,跳过 B 直接找到 A(前提是 B 没有拦截或修改逻辑)
- 多继承时,MRO 可能导致“中间类的方法被跳过”,需用
super()显式委托才确保链式调用
super() 是维持重写链的关键
仅靠重写不保证父级逻辑复用;必须主动调用 super().method() 才构成可扩展的重写链。
- 在 B.method() 中调用
super().method(),才能把控制权交还给 A - 在 C.method() 中调用
super().method(),会根据 MRO 自动调用 B.method()(而非 A),实现逐层向上委托 - 漏掉 super() 就等于切断链条,后续类无法复用中间层增强逻辑
常见误区与调试建议
- 误以为“重写两次 = 原始方法还在”,其实每次重写都替换整个绑定,原始实现不可见
- 在多继承中混用直接调用(
A.method(self))和super()会导致重复执行或跳过 - 调试时优先打印
C.mro(),再结合断点确认super()实际跳转到哪个类 - 使用
@functools.singledispatchmethod或协议类(Protocol)可替代部分重写场景,提升可维护性











