gpt4 book ai didi

python - super在单例中的使用

转载 作者:太空宇宙 更新时间:2023-11-04 01:28:51 24 4
gpt4 key购买 nike

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

最佳答案

传递给__new__方法的cls属性是对Singleton类的引用(cls == Singleton),但是如果您将 Singleton 子类化并实例化该子类,则 cls 将改为对该子类的引用。

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

为了详细说明为什么需要传递 cls,我们假设这些类都有简单的传递 __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

因为在你的例子中唯一的父类(super class)是 objectorig.__new__ 等同于 object.__new__,它被传递给 cls 以便它知道应该实例化哪个类。

关于python - super在单例中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15522162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com