在单身中使用超级

时间:2013-03-20 11:23:29

标签: python singleton

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参数传递?

1 个答案:

答案 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

因为在您的情况下,唯一的超类是objectorig.__new__等同于object.__new__,并且它已经传递cls,因此它将知道应该实例化哪个类。