gpt4 book ai didi

python - 两个呈现的类之间有什么区别?他们的工作方式不同吗?

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

单例的这两种实现有什么区别。在父类中创建变量 _instance 是否使其工作方式不同于第二个类?

class SingletonA(object):
_instance = None

def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = object.__new__(cls, *args, **kwargs)
return cls._instance


class SingletonB(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
cls._instance = object.__new__(cls, *args, **kwargs)
return cls._instance


# sample usage
class A(SingletonA):
pass


print(A() == A()) #True

最佳答案

对于贴出的代码,没有区别。

如果你的子类实现了__bool____len__但是,第一个示例将失败,因为即使设置了实例,not self._instance 也可能返回 True。你真的想使用 if self._instance is None: 代替:

>>> class AlwaysFalse(object):
... def __bool__(self): return False
...
>>> if not AlwaysFalse():
... print("It doesn't exist? Should we create a new one?")
...
It doesn't exist? Should we create a new one?
>>> AlwaysFalse() is None
False

除此之外,差异只是表面上的。

您还想使用身份测试来检查单例实现是否正常工作;一个子类可以实现 __eq__ method并返回 True,即使这两个对象是不同的(所以不是单例):

>>> class EqualNotSingleton(object):
... def __eq__(self, other): return True
...
>>> EqualNotSingleton() == EqualNotSingleton()
True
>>> EqualNotSingleton() is EqualNotSingleton()
False

关于python - 两个呈现的类之间有什么区别?他们的工作方式不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49424160/

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