python - Python中的单例模式
问题描述
我是 Python 新手,我正在尝试通过检查和创建 Python 中的设计模式示例来学习这种语言。
我对单例模式的经典实现感到困惑。那里的大多数文章都提到以下 Singleton 的实现是经典的
class Singleton(object):
name = None
@staticmethod
def instance():
if '_instance' not in Singleton.__dict__:
Singleton._instance = Singleton()
return Singleton._instance
s1 = Singleton().instance();
s2 = Singleton().instance();
assert s1 is s2
但我并不完全相信这个实现,因为我们没有限制用户创建多个 Singleton 类对象,我仍然可以通过调用 Singleton() 创建这个类的实例。在 Java 中,我们通过将类的构造函数设为 Private 来防止这种情况。
有人指出我的另一个实现是
class Singleton(object):
_instances = {}
def __new__(class, *args, **kwargs):
if class not in class._instances:
instance = super().__new__(class)
class.__instances[class] = instance
return class._instances[class]
这让我大吃一惊。有人可以解释一下这是如何工作的吗?
解决方案
首先要记住的是Python 不是 Java。它不像其他语言那样严格。正如 Guido 所说,“我们在这里都是成年人”。没有什么能真正阻止你在 Python 中做大部分事情。解决方案是“不要那样做”。
但是,有几种方法可以做单例。另一种对用户来说看起来更“自然”的方法是使用看起来像类实例化的工厂函数。这是一个例子。
class _Singleton:
_instance = None
def hello(self):
print("Hello!")
def Singleton():
if _Singleton._instance is None:
_Singleton._instance = _Singleton()
return _Singleton._instance
s1 = Singleton()
s2 = Singleton()
assert s1 is s2
推荐阅读
- sql - 根据 PostgreSQL 中的记录集确定自日期
- powershell - 使用函数将年设置为月、日、小时、秒的脚本
- android - 应用程序在 Android 10 上崩溃?
- vba - Insert Table Caption VBA Word
- java - Java中是否有删除一行中直接包含3个数据的索引的功能?
- performance - 量子计算机预期指数级加速的原因
- serial-port - 复制串行 Com 端口以监视设备和软件之间的通信
- javascript - Javascript无法在地图函数中捕获错误
- react-native - ReactNative - FliatList 在渲染许多项目时变成白屏
- dynamics-crm - Dynamics 365 CRM 统一界面中搜索结果的不同视图