2016-03-30 40 views
1
class car(object): 
    def read_spec_and_populate_db(): 
     spec = read_from_file(spec.yaml) 
     populate_db(spec) 

class awd(car): 
    super(awd, self).read_spec_and_populate_db() 

    def foo(self): 
    ... 

class fwd(car): 
    super(fwd, self).read_spec_and_populate_db() 

    def bar(self): 
    ... 

awd類和fwd可以在不同的時間被實例化或僅它們中的一個可以被實例化。現在,有沒有辦法限制基類方法read_spec_and_populate_db()只執行一次?如何限制基類的方法被運行一次

我在SO中查找過,發現here。想看看有沒有其他的選擇。

編輯:不,我反對它。除了使用國旗之外,我正在尋找創意。我目前的實施是在課堂上使用一個標誌。

回答

2

只需使用一個標誌:

class car(object): 
    db_read = False 
    def read_spec_and_populate_db(): 
     if not car.db_read: 
      spec = read_from_file(spec.yaml) 
      populate_db(spec) 
      car.db_read = True 

現在,您可以撥打read_spec_and_populate_db()多次,你想 。它只做一次工作。

+0

,並解釋:你必須跟蹤「已讀」某種程度上,和標誌是一個非常清晰的方式正確地溝通。不要只爲魔術而做魔術。 – MatsLindh

+0

這很好,除了一個類方法更清潔IMO,不是嗎?如果是,更新您的答案,我會刪除我的。我已經向你投票了 –

+0

classmethod不適用於繼承。當你首先創建'awk'的實例時,它會創建'awk.populated = True'。然後當你創建一個'car'的實例時,'car.populated'仍然是錯誤的,並且規格將被第二次讀取。 –

0

可以使用Boolean類屬性標誌來跟蹤該方法是否已經被或無法運行,就像這樣:

class Car(object): 
    _populated_db = False 

    def read_spec_and_populate_db(self): 
     if not self._populated_db: 
      spec = read_from_file(spec.yaml) 
      populate_db(spec) 
      self._populated_db = True 
+0

只是出於興趣,你是否因此而失望? – s16h

+0

是的,因爲我沒有看到兩次相同答案的觀點。 –

-1

一想到可能會被重新分配的名稱read_spec_and_populate_db,在最後一步其執行,以指向具有相同簽名的方法,但是什麼都不做

class car(object): 
    def _dummy(self): 
     pass 

    def read_spec_and_populate_db(self): 
     spec = read_from_file(spec.yaml) 
     populate_db(spec) 

     self.read_spec_and_populate_db = self._dummy