
super() 并非自动调用所有父类方法,而是按 MRO 顺序逐级委托;其“链式调用”效果依赖于每个参与类都主动调用 super(),形成协作式初始化链条。
`super()` 并非自动调用所有父类方法,而是按 mro 顺序逐级委托;其“链式调用”效果依赖于每个参与类都主动调用 `super()`,形成协作式初始化链条。
在 Python 多重继承中,super() 的核心价值不在于“跳转到直接父类”,而在于实现协作式方法调用(cooperative method calls)——它不是单次跳转工具,而是一把开启 MRO 链式委托的钥匙。真正让 Triangle.__init__ 被执行的,并非 RightPyramid 中的一次 super().__init__(),而是整个继承链上每一环节都持续使用 super() 形成的接力机制。
? 理解关键:super() 是“下一个”,不是“父类”
以 RightPyramid(Square, Triangle) 为例,其 MRO 为:
>>> RightPyramid.__mro__ (<class>, <class>, <class>, <class>, <class>)</class></class></class></class></class>
当 RightPyramid.__init__() 执行 super().__init__(...) 时,它调用的是 MRO 中 RightPyramid 之后的第一个类 —— 即 Square;
Square.__init__() 再调用 super().__init__(...),则跳转到 MRO 中 Square 之后的下一个类 —— 即 Rectangle;
Rectangle.__init__() 同样调用 super().__init__(...),继续前进到 Rectangle 之后的类 —— 此时是 Triangle;
最后 Triangle.__init__() 也调用 super().__init__(...),最终抵达 object.__init__()(通常为空操作,安全终止)。
✅ 正是这种每层都主动 super() 的协作约定,才使整个 MRO 链被完整遍历。若任一环节中断(如 Rectangle 中改用 object.__init__(self) 或直接 omit super()),链条即断裂,Triangle.__init__ 将永不执行。
? 示例代码验证协作性
以下精简版可清晰展示协作机制:
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
class A:
def __init__(self):
print("A")
super().__init__() # → object
class B:
def __init__(self):
print("B")
super().__init__() # → object
class C(A, B):
def __init__(self):
print("C")
super().__init__() # → A (MRO: C → A → B → object)
c = C()
# 输出:
# C
# A
# B
# (注意:B 在 A 之后被调用,因 MRO 中 B 在 A 后)
⚠️ 若将 A.__init__ 改为:
class A:
def __init__(self):
print("A")
# ❌ 忘记 super() → 链条在此中断
则输出仅为:
C A
B 和 object 均不再执行。
⚠️ 关键注意事项
- 统一使用是铁律:只要继承链中任意一个类放弃 super()(改用显式类名调用),协作即失效,后续类方法可能被跳过或重复执行。
- `kwargs是协作基石**:如 RealPython 示例所示,**kwargs允许参数在链中“透传”,使Square可接收length,Rectangle接收length/width,Triangle接收base/height`,互不干扰。
- object 是安全终点:所有类最终继承自 object,其 __init__ 接受空参数(def __init__(self, *args, **kwargs): pass),因此 super().__init__(**kwargs) 在末尾总能安全终止。
- 不可用于静态方法:super() 依赖 self 或 cls 绑定上下文,@staticmethod 中无此绑定,无法使用。
✅ 最佳实践总结
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| 单/多重继承中的 __init__ | super().__init__(...) | 保证 MRO 正确、避免重复/遗漏 |
| 需绕过 MRO 强制调特定父类 | ParentClass.method(self) | 如明确需 A.serialize() 而非 MRO 下一个 |
| 类方法中调用父类类方法 | super(cls, cls).classmethod_name() | 显式传入类对象,保持 cls 上下文 |
| 初始化含 **kwargs 的 mixin 类 | super().__init__(**kwargs) + 参数解包 | 支持灵活组合与参数传递 |
super() 不是魔法,而是一种契约:它要求所有参与者共同遵守“调用后继续委托”的约定。唯有如此,菱形继承才能稳健运行,多重初始化才能无缝协同——这正是 Python 多继承强大又可控的底层逻辑。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










