如何解决在Python Singleton设计模式中获得错误的输出
我正在制作一个Singleton设计模式,一切正常。
看下面的代码:
class Singleton():
def __new__(cls):
if not hasattr(cls,'instance'):
cls.instance = super().__new__(cls)
return cls.instance
s1 = Singleton()
s2 = Singleton()
print(s1 is s2)
# True
但这不是Singleton,因为用户可以在创建delattr(Singleton,'instance')
和s1
之间使用s2
,并使用此简单功能s1 is s2
返回False
因此,我决定将instance
更改为__instance
(以停止用户使用delattr(Singleton,'instance')
),但是当我这样做时,我在打印s1 is s2
时得到False
(我的新代码(__instance))
class Singleton():
def __new__(cls):
if not hasattr(cls,'__instance'):
cls.__instance = super().__new__(cls)
return cls.__instance
s1 = Singleton()
s2 = Singleton()
print(s1 is s2)
# False
但是问题出在哪里?
为什么当我将instance
更改为__instance
时,我得到的结果是False?
(我知道创建Singleton的其他方法,我只是想知道当我在课堂上并且instance
不是自己的私人时,__instance
和__instance
有什么不同)
解决方法
Python名称会破坏变量。在__dict__
类中称为“ _Singleton__instance”。您可以改用该名称,也可以使用异常处理程序进行分配。在这种情况下,python会帮您处理问题,它也适用于Singleton的子类。
class Singleton():
def __new__(cls):
# could do this ....
#if not hasattr(cls,'_Singleton__instance'):
# cls.__instance = super().__new__(cls)
#return cls.__instance
try:
return cls.__instance
except AttributeError:
cls.__instance = super().__new__(cls)
return cls.__instance
s1 = Singleton()
s2 = Singleton()
print(s1 is s2)
当然它仍然很容易被击败
delattr(Singleton,"_Singleton__instance")
s3 = Singleton()
print(s1 is s3)
Python是一种非常动态的语言,如果有人想伤害自己,那就试试吧!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。