我是Python的新手,我正在尝试通过检查和创建Python设计模式的示例来学习这门语言。
我对Singleton模式的经典实现感到困惑。大多数文章都将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]这让我头晕目眩。有人能给我解释一下这是怎么回事吗?
发布于 2018-09-16 14:06:12
首先要记住的是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 s2https://stackoverflow.com/questions/52351312
复制相似问题