super().__init__() 是必须调用的,否则父类实质性初始化(如属性分配、资源打开)将被跳过,导致实例状态残缺、后续访问抛 attributeerror;它在多继承中确保 mro 正确执行且避免重复/遗漏,python 3 零参数 super() 更安全可靠。

不是“必须”,而是“不调用就会出错”——只要父类的 __init__ 里做了实质性初始化,比如分配属性、打开资源、注册钩子,漏掉 super().__init__() 就会导致实例状态残缺,后续访问直接抛 AttributeError 或逻辑异常。
子类定义了 __init__ 就自动屏蔽父类初始化
Python 不会自动链式调用父类 __init__。一旦你在子类里写了自己的 __init__,父类那个就彻底被跳过,不管它有没有参数、是不是空函数。
- 即使父类
__init__只是print("init"),子类不调super(),这行也不会执行 - 如果父类初始化了
self._pool或self.config,子类实例上就根本不存在这些属性 - 这不是警告,是静默失败:代码能跑,但一用就崩,且错误位置远离问题根源
super().__init__() 在多继承和 MRO 中不可替代
显式写 Parent.__init__(self) 看似简单,但在多重继承(尤其是钻石继承)下会失控。而 super() 依赖方法解析顺序(MRO),确保每个父类只被初始化一次,且顺序可控。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 写
A.__init__(self)会硬编码调用 A,绕过 MRO,可能跳过 B 或重复调 C -
super()自动查type(self).mro(),找到当前类之后的下一个含__init__的类 - Mixin 类必须用
super(),否则控制权无法往下传,下游初始化直接中断
Python 3 的零参数 super() 是默认推荐写法
不用再手动传类名和 self,Python 3 能从上下文自动推断。这不是语法糖,是避免人为失误的关键设计。
- 写
super(MyClass, self).__init__()容易抄错类名,尤其重构时类名变了但没改这里 -
super().__init__()更短、更安全,且在嵌套类或闭包中依然可靠 - 它和
super(Child, self).__init__()行为完全一致,只是省去了冗余信息
最容易被忽略的一点:很多父类初始化逻辑藏在第三方库或框架基类里(比如 torch.nn.Module、threading.Thread、QObject),它们不报错也不提示,但漏掉 super().__init__() 会导致资源未分配、信号未连接、梯度不更新等“幽灵 bug”。别等崩溃才补,从第一行子类 __init__ 就写上。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










