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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:29:07