gpt4 book ai didi

python - 简单单例实现中的 super(type,subclass)

转载 作者:太空宇宙 更新时间:2023-11-03 18:20:45 26 4
gpt4 key购买 nike

当我在 python 中实现 naive singleton 时,我遇到了 super 关键字的问题。与往常一样, super 的行为总是很棘手且有问题,希望有人能够阐明它。谢谢:)

问题在于:

class Singleton(object):
def __new__(cls,*args,**kw):
if not hasattr(cls,'_instance'):
#create a instance of type cls,
origin=super(Singleton,Singleton).__new__(cls,*args,**kw)
cls._instance=origin
return cls._instance

class B(Singleton):
def __init__(self,b):
self.b=b

它确实有效,但我想知道

如果我像大多数书中那样将第 5 行更改为下面的内容会更好吗?

origin=super(Singleton,cls).__new__(cls,*args,**ks)

有什么区别?

最佳答案

super() 在当前对象的 MRO 中搜索具有所请求属性的下一个类。 super() 的第一个参数确定 MRO 搜索的起点,第二个参数确定从中获取 MRO 的对象。

只要您不使用多重继承,您的 MRO 就会很简单。在这种情况下,Singleton 将始终位于 MRO 中的同一位置。使用多重继承时,子类的 MRO 中出现的 Singleton 会有所不同,并且您确实希望使用 cls 来获取当前 MRO,不仅仅是 Singleton 的 MRO。

对于您的简单示例,忽略 cls (例如 B)就可以了:

>>> class Singleton(object):
... def __new__(cls,*args,**kw):
... if not hasattr(cls,'_instance'):
... #create a instance of type cls,
... origin=super(Singleton,Singleton).__new__(cls,*args,**kw)
... cls._instance=origin
... return cls._instance
...
>>> class B(Singleton):
... def __init__(self,b):
... self.b=b
...
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.Singleton'>, <type 'object'>)
>>> Singleton.__mro__
(<class '__main__.Singleton'>, <type 'object'>)

因此 super(Singleton, Singleton)super(Singleton, cls) 最终搜索相同的子列表,只找到 object

但是使用多重继承,您将得到一个非常不同的MRO;请注意,Foo 列在 Singletonobject 之间:

>>> class Foo(object): pass
...
>>> class Bar(Singleton, Foo): pass
...
>>> Bar.__mro__
(<class '__main__.Bar'>, <class '__main__.Singleton'>, <class '__main__.Foo'>, <type 'object'>)

如果您使用 super(Singleton, Singleton),则在查找继承方法时,Foo 会被无意地跳过super(Singleton, cls) 将搜索 (Foo, object)super(Singleton, Singleton) 将仅查看 object .

关于python - 简单单例实现中的 super(type,subclass),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24193955/

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