我是Python的新手,我试图通过检查并创建Python设计模式示例来学习这种语言。
我对Singleton Pattern的经典实现感到困惑。那里的大多数文章都提到将Singleton实现为经典
<link rel="stylesheet" href="cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css">
<link rel="shortcut icon" type="image/png" href="pictures/pinky.png">
<script src="use.fontawesome.com/0c9491c5b9.js"></script>
但是我对这种实现方式并不完全信服,因为在任何地方我们都没有限制用户创建Singleton类的多个对象,并且我仍然可以通过调用Singleton()创建此类的实例。在Java中,我们通过将类的构造函数设置为Private来防止这种情况。
有人指出我的另一个实现是
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
这使我头昏了头脑。有人可以解释一下这是怎么回事吗?
答案 0 :(得分:6)
要记住的第一件事是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