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

为何调用base.__init__()需显式传入self,而super().__init__()无需?

为什么直接调用父类__init__需要传self,而super()不用?

在Python中,从派生类调用父类构造函数的两种方式super().__init__()和base.__init__(self),核心差异在于方法是否与实例绑定:

1. super().__init__()的工作逻辑

super()函数会返回一个绑定了当前实例的超类代理对象。这个代理已经自动关联了派生类实例的self,所以调用__init__时,不需要再显式传入self参数。它会严格按照类的MRO(方法解析顺序)找到对应的父类构造方法,并自动把当前实例传递过去。

2. base.__init__(self)的必要性

当你直接通过base.__init__调用父类构造时,你调用的是一个未绑定的实例方法——因为是从类本身直接调用,而不是通过实例触发。Python的实例方法默认第一个参数self必须接收当前实例对象,所以必须手动传入派生类的self,让父类的__init__知道要初始化哪个实例。

如果像base.__init__()这样不传self,Python会认为你缺少了这个必填的位置参数,直接抛出TypeError。

代码演示与错误分析

以下是测试代码:

class base:
    def __init__(self,/):
        print("initializing")

class der(base):
    def __init__(self):
        super().__init__()  # 正常运行:super已绑定self
        base.__init__(self) # 正常运行:手动传入self绑定实例
        base.__init__()     # 报错:缺少self参数

obj = der()

运行后抛出的错误:

File "demo.py", line 11, in <module>
    obj = der()
          ^^^^^
  File "demo.py", line 9, in __init__
    base.__init__() #error, should be: base.__init__(self)
    ^^^^^^^^^^^^^^^
TypeError: base.__init__() missing 1 required positional argument: 'self'

这个错误直接说明:未绑定的base.__init__函数必须接收self参数才能执行。

额外提示

虽然两种方式都能调用父类构造,但super()更推荐在多继承场景下使用——它会自动遵循MRO处理调用顺序,避免重复调用或逻辑混乱;而直接指定父类的方式在多继承时容易破坏MRO规则,引发难以排查的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 06:37:02