Skip to main content
 首页 » 编程设计

Python Singletons 语法以及为什么它看起来像那样

2025年05月04日18mq0036

我的第一个问题:

我之前在网上搜索过,也在这里阅读过几个问题和答案,最后想出了为我的 python 代码编写单例类的方法。 我还阅读了有关 new() 函数和其他一些内容的 python 文档,但仍然对所有 new(cls, *args , **kw) 等等!

例如我写了这样一个测试代码:

class Singleton(object): 
 
    def __new__(cls, *args, **kwargs): 
        if '_inst' not in vars(cls): 
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) 
        return cls._instance 
 
class printer(Singleton): 
 
    def __init__(self): 
 
        print "I am a new Object, and will remain until the end of time!" 
 
if __name__ == '__main__': 
    printer() 

结果是文本“我是一个新的对象,并将一直存在到时间的尽头!” 但这是如何工作的,我的意思是,我不知道如何分辨,例如我真的很困惑:

vars(cls):在行 if '_inst' not in vars(cls)

从 vars(cls) 出来的地方,我之前没有声明! 有人可以在单例类中为我澄清这些事情以及关于最后一行的一些内容

if __name__ == '__main__': 
    printer() 

请您参考如下方法:

首先,这是错误的:

class Singleton(object): 
    def __new__(cls, *args, **kwargs): 
        if '_inst' not in vars(cls): # <-- this must of course also be "_instance" 
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) 
        return cls._instance 

显式 __new__方法可以像工厂模式一样使用,所以当你写printer()时,Python会首先调用__new__,传递类类型和构造函数参数(在这个例子中没有).

'_instance' not in vars(cls) 只是意味着查找该类是否已经具有名为“_instance”的属性(即单例)。如果没有,则创建一个。 vars 的技巧(内置函数,回答你的问题)不是必需的,例如,也可以使用 cls._instance 并捕获 AttributeError。

最后一件事:

if __name__ == '__main__': 
    printer() 

如果直接执行脚本(即如果 __name__ == '__main__'),这只会创建一个 printer 实例(使用 Singleton.__new__) >,如果模块是导入的则不会)。