You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python基类中调用无参数super().__init__()的作用是什么?

基类里调用无参数super().__init__()的实际作用

很多人会觉得继承自object的基类里写super().__init__()是多余的,但实际上这是Python3中super()的动态特性带来的预留设计,核心点在于:

super()不是固定指向父类,而是跟着实例的MRO走

Python3的无参数super()会根据**调用这个方法的实例的MRO(方法解析顺序)**来定位下一个要执行的类,而不是定义该方法的类的直接父类。举个实际场景:

# 定义一个基类,里面调用super().__init__
class Base:
    def __init__(self):
        print("Base初始化")
        super().__init__()

# 另一个独立的基类
class OtherBase:
    def __init__(self):
        print("OtherBase初始化")

# 多继承这两个类
class MyClass(Base, OtherBase):
    def __init__(self):
        print("MyClass初始化")
        super().__init__()

# 实例化MyClass,输出顺序是:
# MyClass初始化
# Base初始化
# OtherBase初始化

这里MyClass的MRO是[MyClass, Base, OtherBase, object],当Base.__init__里的super()被调用时,它找的是MRO中Base的下一个类OtherBase,而不是object——这就是这个调用的实际价值。

原作者这么写的原因

  • 预留多继承扩展性:原作者可能一开始就考虑到这个基类未来会被用于多继承场景,提前写好super()调用,避免后续需要修改基类代码来适配多继承。
  • Python2迁移遗留:如果代码是从Python2迁过来的,Python2里super必须传Base, self,迁移到Python3时改成无参数形式,保留了原有逻辑。

什么时候这个调用看起来“没用”?

如果这个基类从来不会被用于多继承,只是单独实例化,那super().__init__()确实只会调用object.__init__()——而object.__init__()本身没有任何业务逻辑,只是做最基础的对象初始化,这时看起来就像“没作用”。

内容的提问来源于stack exchange,提问作者bd2357

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:36:22