2
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

有人可以详细解释这里发生的事情>> super(Singleton, cls) 传递了什么 cls 参数吗?

4

1 回答 1

3

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,以便它知道应该实例化哪个类。

于 2013-03-20T11:53:48.577 回答