views:

237

answers:

4

Hi SO's

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!!

+1  A: 

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++.

EToreo
+1  A: 

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

I've found this implementation I hope it helps

OscarRyz
+3  A: 

See singleton in python.

Ewan Todd
A: 

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.

Nikwin