python - 在 python 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
但这不是单例,因为用户可以delattr(Singleton,'instance')
在创建s1
和之间s2
使用这个简单的函数s1 is s2
返回 False
所以我决定改为instance
(__instance
停止用户使用delattr(Singleton,'instance')
),但是当我这样做时,我在打印时得到 False s1 is s2
(我的新代码(__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?
(我知道创建单例的其他方法我只是想知道我在课堂上的不同之处instance
和时间,而不是我自己的私人)__instance
__instance
解决方案
Python 名称会破坏变量。它在类中称为“_Singleton__instance” __dict__
。您可以改用该名称或使用异常处理程序进行分配。在这种情况下,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 是一种非常动态的语言,如果有人想伤害自己,那就试试吧!
推荐阅读
- sql - 加入查询包括少于 N 艘船的所有船类
- javascript - TypeScript 中的 d3 选择合并错误:属性“合并”的类型不兼容
- reactjs - 似乎无法在反应中实现引导网格
- selenium-chromedriver - 最近的 ChromeDriver 更新似乎破坏了 Actions 类方法
- php - 如何在php中上传图片?
- typescript - 在表格自适应卡片中使表格单元格可点击
- node.js - 部署 + 使用 CLI 客户端时 Heroku 应用程序错误
- python - 旋转和聚合大量列
- python - 如何创建一个pandas pivot df聚合值
- django - 在 admin.site.register 函数中添加类时出错