Python Singletons语法及其原因是什么?

时间:2011-03-05 17:05:59

标签: python syntax singleton new-operator main

我的第一个问题:

我已经搜索过互联网并在此之前阅读了几个问题和答案,最后想出了为我的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()

3 个答案:

答案 0 :(得分:2)

你应该在python中使用模块作为单例,因为它们的行为完全像一个。

这是另一个问题:Is there a simple, elegant way to define singletons?

答案 1 :(得分:2)

首先,这是错误的:

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()

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

答案 2 :(得分:2)

您是否考虑使用Borg

,而不是使用单身人士

这个想法是,因为Python将实例的所有状态存储在属性(__dict__)中,如果您只是将该属性重新分配给类属性,那么您可以根据需要多次实例化该类,但是将全部拥有相同的州。