Python代码:仅初始化一个类的一个实例

时间:2012-12-10 18:24:12

标签: python singleton single-instance

对不起新手初学者程序员质疑一次只运行一个类的实例;现在正努力找到构建代码的正确方法。

我已经研究过但很难找到正确的方法,但关于正确的pythonic方法的许多争论都是模块或Singltons,例如Ensure that only one instance of a class gets run

我有一些代码(python 2.7.2)不断记录3个变量(2个温度和一个压力传感器),然后根据一些逻辑查看变量的趋势,移动一个阀门(如果声明如果为真,则调用模块中的defs散布着大量的全局变量,因为我实际上希望我的所有defs看到相同的数据集并移动相同的阀门)。在这一刻,这一切都在模块文件中正常工作。

但是,实验室中的其他人可以运行我的代码,它需要从通用GUI启动,因此我的代码需要进行线程处理,以便该进程不会占用GUI和命令行。

我开始将代码重新编写成一个Class(带有线程超类),并希望添加一些逻辑,只调用了一个Class的一个实例,因此> 1个线程没有尝试控制同一个阀门。

现在,我发现在python中这并不容易,并且读到“Singletons”的概念很糟糕,并且正在努力寻找如何构建代码的解决方案。

如果有人能指出我正确的方向,我将不胜感激,因为我猜这肯定已经得到了解答。

2 个答案:

答案 0 :(得分:1)

您应初始化一个实例并仅访问初始化常量 为了安全起见,如果有人试图创建另一个实例,则引发异常

class Singletone(object):
    __initialized = False
    def __init__(self):
        if Singletone.__initialized:
            raise Exception("You can't create more than 1 instance of Singletone")
        Singletone.__initialized = True

MY_SINGLETONE_INSTANCE = Singletone()

答案 1 :(得分:-1)

来自http://norvig.com/python-iaq.html

def singleton(object, instantiated=[]):
    "Raise an exception if an object of this class has been instantiated before."
    assert object.__class__ not in instantiated, \
        "%s is a Singleton class but is already instantiated" % object.__class__
    instantiated.append(object.__class__)

class YourClass:
    "A singleton class to do something ..."
    def __init__(self, args):
        singleton(self)
        ...

不确定如何为多线程应用程序调整它。