2017-09-19 35 views
0

假設我們想用一個類強制調用類中的方法序列

class MyClass(): 
    def __init__(self): 
     pass 

    def generate_query(self): 
     # Generate the query 
     pass 

    def send_query(self): 
     # send the query over the network 
     pass 

    def receive_response(self): 
     # read the response from buffer 
     pass 

什麼是確保generate_query()已經send_query()之前調用的最佳方式着,當然反之亦然沒有按」實現的功能沒有意義。這很重要,因爲在您調用send_query()之前簡單地提及在API文檔中調用另一種方法是另一回事,但在send_query()之前調用generate_query()的代碼中明確檢查它是一個很好的做法IMO。

我期待着一個解決方案,如果generate_query()還沒有被調用,我們引發一個例外。

有一個很好的pythonic方法來做到這一點,我曾經在某處讀過,但我忘了源代碼和解決方案。

幫助表示讚賞!

+1

你不能只從'__init__'調用它嗎? –

+0

我無處可以打個電話,假設這是一個模塊,並且會被另一個程序員使用(你甚至不知道是誰!),我怎麼確保他按正確的順序使用這些方法,只需調用receive_response首先會引發一個異常 – sinister

+0

如果您在'__init__'中包含對'generate_query'的調用,那麼每次創建類的新實例時都會調用它。就像@Klaus D.說的那樣 - 電話會有保證。 – atru

回答

0

我的想法是保持實例變量名稱標誌爲True,如果調用generate_query,並且如果flag爲false,則表示generate_query未被調用,因此,您將調用send_query中的generate_query或顯示一條消息。

0

一個選項可能是使用布爾標誌。這種方法很簡單,但不是很乾淨。

class MyClass(): 
    def __init__(self): 
     self.generated = False 

    def generate_query(self): 
     self.generated = True 

     # Generate query 

    def send_query(self): 
     if not self.generated: 
      self.generate_query() 

     # Send query 

    def receive_response(self): 
     pass 

我建議你嘗試重建類和方法。要求以特定順序運行的方法容易出錯,特別是如果沒有記錄。

+0

即使有文檔記錄,作爲模塊編寫器,我應該以某種方式對類進行編碼,如果之前調用了'send_query',則會引發異常'generate_query',是不是像在調用'socket.socket()'之前調用'socket.connect()',不要完全比喻! – sinister

+0

是的@sinister,這使得其他人更容易。但是,在具有私有訪問器的語言(如Java)中,則可以更好地隱藏相互依賴的方法。因爲Python中的所有東西都是公共的,所以它可能使事情更容易出錯。 – OptimusCrime

相關問題