首页 > 解决方案 > 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]

这让我大吃一惊。有人可以解释一下这是如何工作的吗?

标签: pythondesign-patterns

解决方案


首先要记住的是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

推荐阅读