python - 有人可以向我解释这种单例模式是如何工作的吗?
问题描述
我正在使用这种单例模式并且它有效,但我无法弄清楚它在做什么。有人可以向我解释这个程序是如何工作的吗?
谢谢!
class Singleton(object):
_instances = {}
def __new__(class_, *args, **kwargs):
if class_ not in class_._instances:
class_._instances[class_] = super(Singleton, class_).__new__(class_, *args, **kwargs)
return class_._instances[class_]
class Context(Singleton):
#do things
解决方案
单例模式是指您只能启动一次的类。如果您尝试创建单例类的第二个对象,它只会返回已经启动的对象
让我们一步一步地分析代码
_instances = {}
这是一个字典,我们保存我们已经创建的对象。这里要理解的重要一点是,这是在对象之间共享的。当你创建一个新对象时,你总是得到相同的字典。
if class_ not in class_._instances:
class_._instances[class_] = super(Singleton, class_).__new__(class_, *args, **kwargs)
现在正如我之前提到的,单例创建一个对象一次,如果您尝试创建一个新对象,它会再次返回它。这里的代码通过查看字典内部来检查我们是否已经创建了对象。如果我们还没有创建它,它将创建一个新对象并将其保存到 _instances 字典中。如果它已经存在,它将跳过此代码。
return class_._instances[class_]
然后我们返回保证它存在的对象。请记住,我们已经检查过我们没有创建此类的实例,因此我们可以创建一个新实例。如果它已经创建,我们只需从字典中返回它。
推荐阅读
- python - Python:快速上传大文件 S3
- javascript - React - 搜索输入未正确过滤
- java - 使用 Dropwizard 提供静态资产
- python - 根据例外列表删除选择性连字符/标点符号
- embedded - stm32f427 interrupt clear pending bit
- c# - 如何在 MVC 中查看 PDF 文档而不是直接下载?
- javascript - OpenLayers 4 - Visual Studio 中的本地名称不正确
- node.js - Why i can not use express node js on my server?
- bash - 当脚本来自 cron 时,BASH_SOURCE 变量为空
- selenium-webdriver - 如何迭代硒中的元素