为何调用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
相关产品推荐
相关产品推荐

