Lok*_*wal 1 python design-patterns
我是Python的新手,我想通过检查并创建Python设计模式示例来学习这种语言。
我对Singleton Pattern的经典实现感到困惑。那里的大多数文章都提到将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
Run Code Online (Sandbox Code Playgroud)
但是我对此实现并不完全相信,因为在任何地方我们都不能限制用户创建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]
Run Code Online (Sandbox Code Playgroud)
这使我头昏了头脑。有人可以解释一下这是怎么回事吗
首先要记住的是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
Run Code Online (Sandbox Code Playgroud)