我是 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 is not 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
