Python中super(subclass, class).__new__(class)作用及单例模式语句解析
关于Python中
super与单例模式的疑问解答 嘿,我来一步步拆解你的问题,帮你彻底搞懂这里的逻辑:
1. super(subclass, class).__new__(class) 的核心作用
这行代码的本质是绕开当前类的__new__方法,调用父类的__new__来创建当前类的实例。拆解来看:
super(subclass, class):生成一个代理对象,指向subclass继承链中,class类的直接父类。简单说就是“找父类来干活”。- 调用
__new__(class):因为__new__是类方法,必须接收类对象作为第一个参数(也就是我们常说的cls),所以这里传入class,让父类的__new__来创建一个class类型的实例。
2. 单例代码中 cls.instance = super(Singleton, cls).__new__(cls) 的作用
结合单例模式的核心目标(一个类只能有一个实例)来看:
- 我们的
__new__方法里先判断cls(也就是Singleton类)有没有instance属性——这是我们用来存唯一实例的“容器”。 - 如果直接写
cls.instance = Singleton(),会递归调用当前的__new__方法,直接陷入死循环。所以必须找父类(这里是object)的__new__来帮忙创建实例,这样就能绕过当前类的__new__逻辑,生成一个干净的Singleton实例,然后把它存在cls.instance里,后续再调用Singleton()时直接返回这个实例,实现单例。
3. super(subclass, class) 这种用法的含义
你之前见过的super(subclass, instance)是绑定实例的用法:此时super返回的代理对象绑定到instance,调用实例方法时会自动把instance作为self传入。
而super(subclass, class)是绑定类的用法:
- 当第二个参数是类对象时,super返回的代理对象绑定到这个类,调用类方法(比如
__new__)时,会自动把这个类作为cls传入。 - 回到你的代码里,
super(Singleton, cls)中cls就是Singleton类,所以这个super会定位到Singleton的父类object,然后调用object.__new__(cls)——也就是让Python的原生对象创建逻辑生成一个Singleton实例,完美避开了当前类的__new__递归问题。
内容的提问来源于stack exchange,提问作者techkuz
相关产品推荐
相关产品推荐

