使用super()调用__init__与__new__的差异
为什么super()调用__new__需要传cls,调用__init__不需要传self?
这是个非常关键的问题,核心要从__new__和__init__的方法本质,以及super()的工作逻辑来拆解:
1. 先明确两个特殊方法的类型差异
__new__(cls)是类方法:它是Python内置的特殊类方法(不需要手动加@classmethod装饰器),作用是创建并返回类的实例。它的第一个参数必须是类本身cls,因为它要基于这个类来生成实例。__init__(self)是实例方法:它的作用是初始化已经创建好的实例,第一个参数是已经生成的实例对象self,只有当实例存在时才能调用。
2. 结合super()的参数逻辑分析
调用__new__时需要传cls的原因
在你的代码中:
def __new__(cls): c = super(Child, cls).__new__(cls) return c
super(Child, cls)返回的是父类Parent的代理对象,这个代理是基于cls(也就是Child类)的上下文创建的。- 由于
__new__是类方法,它本身必须接收类作为第一个参数,所以我们需要显式把cls传递给父类的__new__方法,否则它不知道要基于哪个类创建实例。
调用__init__时不需要传self的原因
再看__init__的代码:
def __init__(self): super(Child, self).__init__()
super(Child, self)返回的是父类Parent的代理对象,这个代理是基于实例self的上下文创建的。- 对于实例方法来说,当通过
super()代理调用时,Python会自动把self作为第一个参数传递给父类的__init__方法,所以不需要我们手动传入self。
额外补充:Python 3的简化写法
其实在Python 3中,super()可以省略参数,直接写成:
class Child(Parent): def __new__(cls): c = super().__new__(cls) return c def __init__(self): super().__init__()
Python会自动从当前方法的上下文推断出对应的类和实例,效果和显式传参完全一致。
内容的提问来源于stack exchange,提问作者skyline
相关产品推荐
相关产品推荐

