2009-10-15 103 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

相關問題