确保只运行一个类的一个实例

时间:2009-10-15 23:33:02

标签: python singleton

我有一个基础类,我想放在一些代码中。我只希望它被实例化或为给定的应用程序启动一次,尽管它可能被多次调用。下面代码的问题是LowClass一次又一次地启动。我只希望每次测试都能启动一次..

import logging

class LowClass:

    active = False

    def __init__(self):
        self.log = logging.getLogger()
        self.log.debug("Init %s" % self.__class__.__name__)
        if self.active:
            return
        else:
            self.active = True
        self.log.debug("Now active!")

class A:
    def __init__(self):
        self.log = logging.getLogger()
        self.log.debug("Init %s" % self.__class__.__name__)
        self.lowclass = LowClass()

class B:
    def __init__(self):
        self.log = logging.getLogger()
        self.log.debug("Init %s" % self.__class__.__name__)
        self.lowclass = LowClass()

class C:
    def __init__(self):
        self.log = logging.getLogger()
        self.log.debug("Init %s" % self.__class__.__name__)
        self.a = A()
        self.b = B()


class ATests(unittest.TestCase):
    def setUp(self):
        pass

    def testOne(self):
        a = A()
        b = B()

    def testTwo(self):
        c = C()

感谢您指出我的问题!!

5 个答案:

答案 0 :(得分:7)

请参阅singleton in python

答案 1 :(得分:2)

查找“单身模式”。它看起来像你正在处理的Python,所以你可能需要更加努力地搜索。我现在在C ++中有很多例子。

答案 2 :(得分:2)

您需要在python中实现Singleton设计模式

我发现这个implementation我希望它有所帮助

答案 3 :(得分:2)

在python中导入模块时,它是自然的单例。 例如, 在util.py中,你有:

   class MyClass(object):
        ......

    g_my_obj = MyClass()

在a.py中,导入g_my_obj:

from util import g_my_obj

在b.py中,您再次导入g_my_obj:

from util import g_my_obj

安全地,无论您导入多少次,都只创建了一个g_my_obj。

答案 4 :(得分:1)

我认为显示的代码问题是您设置了self.active=True。这将为实例创建一个属性并将其设置为True,而我相信您希望将类本身的活动设置为True。因此,请尝试self.active=True

,而不是self.__class__.active=True