Skip to main content
 首页 » 编程设计

python之Python 中的单例模式

2025年05月04日13langtianya

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