开发者

Ensure that only one instance of a class gets run

I have an underlying class which I want to place in some code. I only want it to be instantiated or started once for a given app although it might be called many times.. The problem with the code below is that LowClass is started over and over again. I only want it to start once per test..

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

Thanks for pointing out my problem!!


See singleton in python.


What you need is to implement the Singleton Design pattern in python

I've found this implementation I hope it helps


Look up "singleton pattern". It looks like Python you are dealing with, so you might have to search a bit harder. I now there are plenty of examples in C++.


When you import a module in python, it is natural singleton. For example, in util.py, you have:

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

    g_my_obj = MyClass()

in a.py, you import g_my_obj:

from util import g_my_obj

in b.py, you import g_my_obj again:

from util import g_my_obj

Safely, there is only one g_my_obj created no matter how many times you import it.


I believe that the problem with the code shown is that you set self.active=True. This will create an attribute for the instance and set that to True, whereas I believe that you want to set the active of the class itself to True. So, instead of self.active=True, try self.__class__.active=True.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜