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

Python中为何super()能在类__new__方法内实例化该类?

Python单例类__new__方法的疑问解答

问题场景

我近期有单例类的使用需求,最终采用如下定义:

class SubClient(BaseClient):

    def __new__(cls):
        if not hasattr(cls, 'instance'):
            cls.instance = super(SubClient, cls).__new__(cls)
        return cls.instance

测试后功能正常,但产生了两个疑问:

  • 为何在SubClient.__new__方法的定义中,super(SubClient, cls).__new__(cls)能返回SubClient的实例?
  • __new__是创建SubClient的方法,为何在该方法的定义内就能创建SubClient实例?

问题解答

1. 关于super(SubClient, cls).__new__(cls)返回SubClient实例的原因

super(SubClient, cls)的作用是获取SubClient父类(BaseClient)的代理对象,但调用__new__时传入的第一个参数是cls——也就是SubClient类本身。

Python中__new__的核心逻辑是根据传入的类参数创建对应类型的实例,它只关注你传入的类是谁,不管是通过哪个类的代理对象调用它。哪怕直接调用object.__new__(SubClient)(如果BaseClient继承自object),也能得到SubClient的实例,原理完全一致。

2. 关于__new__方法内部创建自身类实例的原因

__new__是Python负责创建实例的特殊方法,但它本质上就是一个类方法。你在SubClient.__new__里调用的是父类的__new__,不是递归调用自己的__new__。

父类的__new__是独立的实现,它会直接在内存中分配空间、初始化对应类的实例,不需要依赖子类的__new__方法。只有当cls.instance不存在时,这段代码才会触发父类__new__的调用,完全不会出现递归死循环的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:45:21