2009-10-15 43 views
4

我有一个基础类,我想放在一些代码中。我只希望它被实例化或为给定的应用程序启动一次,尽管它可能会被调用很多次。下面的代码的问题是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() 

感谢您指出我的问题!

+2

随着手中的专有名称 - “单身” - 现在有许多关于SO的讨论这个话题的问题(如Alex Martelli的Borg模式,等等)。现在投票表示提问者对设计模式有适当的术语。 – 2009-10-15 23:52:34

回答

1

查找“单身模式”。它看起来像你正在处理的Python,所以你可能不得不搜索更难。我现在有很多C++的例子。

0

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

1

当你在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。

+0

比其他答案更清晰和更容易,并且不需要自定义类来实现它 – RPDeshaies 2013-12-10 17:54:34

相关问题