cls
传递给__new__
方法的属性是对Singleton
类 ( cls == Singleton
) 的引用,但如果您对子类进行子类Singleton
化和实例化,cls
则将是对子类的引用。
super
需要知道当前类 ( Singleton
) 和它正在遍历其类层次结构的子类 ( cls
) 以计算类层次结构中的下一个类,但在您的情况下,它们总是相同的,因为Singleton
没有任何子类。
为了详细说明为什么需要 pass cls
,我们假设这些类都有简单的 pass-through__new__
方法,它们简单地调用它们的 super 方法并返回结果。
class A(object): pass
class B(object): pass
class C(A, B): pass
然后C.__new__
调用super(C, cls).__new__
,相当于A.__new__
. 现在在这里你想super(A, cls).__new__
等价于B.__new__
,而不是object.__new__
。但唯一super
能找出答案的方法是被告知开始是在C
,而不是在A
。
因为在您的情况下,唯一的超类是object
,orig.__new__
等价于object.__new__
,并且它已通过cls
,以便它知道应该实例化哪个类。