class Singleton(object):
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kw)
return cls._instance
有人可以详细解释此处发生的事情>>超级(Singleton,cls) 什么cls参数传递?
答案 0 :(得分:3)
传递给cls
方法的__new__
属性是对Singleton
类(cls == Singleton
)的引用,但如果您已将Singleton
子类化并实例化该子类,cls
将是对子类的引用。
super
需要知道当前类(Singleton
)和它所遍历的类层次结构(cls
)的子类,以计算类层次结构中的下一个类,但是在你的情况它们总是相同的,因为Singleton
没有任何子类。
为了详细阐述为什么有必要通过cls
,让我们假设这些类都有简单的传递__new__
方法,只需调用它们的超级方法并返回结果。
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
,因此它将知道应该实例化哪个类。