Python super在singleton中的用法

Python super在singleton中的用法,python,singleton,Python,Singleton,有人能详细解释一下这里发生了什么吗>>super(Singleton,cls) 对于传递的cls参数是什么?传递到\uuuu new\uuuu方法的cls属性是对Singleton类(cls==Singleton)的引用,但是如果您对Singleton进行子类化并实例化该子类,cls将是对子类的引用 super需要知道当前类(Singleton)和它正在遍历其类层次结构的子类(cls),以计算类层次结构中的下一个类,但在您的情况下,它们总是相同的,因为Singleton没有任何子类 为了详细说明

有人能详细解释一下这里发生了什么吗>>super(Singleton,cls)
对于传递的cls参数是什么?

传递到
\uuuu new\uuuu
方法的
cls
属性是对
Singleton
类(
cls==Singleton
)的引用,但是如果您对
Singleton
进行子类化并实例化该子类,
cls
将是对子类的引用

super
需要知道当前类(
Singleton
)和它正在遍历其类层次结构的子类(
cls
),以计算类层次结构中的下一个类,但在您的情况下,它们总是相同的,因为
Singleton
没有任何子类

为了详细说明为什么有必要传递
cls
,让我们假设这些类都有简单的传递
\uuuuuuuuuuuuuuuu
方法,这些方法只调用它们的超级方法并返回结果

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
然后,
C.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
调用
super(C,cls)。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。现在,您希望
super(A,cls)。\uuuuu new\uuuuu
等同于
B.\uuuu new\uuuuu
,而不是
对象。但是,
super
能够找到答案的唯一方法是被告知起点在
C
,而不是
A


因为在您的例子中,唯一的超类是
对象
orig.\uuuuu new.\uuuuuu
相当于
对象.\uuuuuu new.\uuuu
,它被传递给
cls
,这样它就知道应该实例化什么类了。

这可能会有帮助吗?也许这会有帮助?文档中提到了这个成语,虽然没有太多解释。@loki你能把这个问题重新表述一下吗?我不确定我是否理解你的要求。
class A(object): pass
class B(object): pass
class C(A, B): pass