我正在構建一個利用屬性鏈接的Python類。我試圖弄清楚是否有一種方法可以確定鏈的最終屬性何時被調用,並執行一些處理代碼。在調用最終的鏈接屬性之後,我想要處理收集的數據。我意識到可以在鏈的末尾顯式調用處理屬性,但如果可能的話,我想避免這種情況。鏈接方法後調用屬性
例如:
o = ObjectInstance()
# Note that the attribute calling order is subjective
o('data').method_a('other data').method_c('other_data') #o.process() is called here automatically
--Update--
我找到了一個解決方法是具體到我的情況,但沒有回答的基本問題。
對於我的特殊情況,我打算用單個實例分別處理多個鏈。通過重寫我的類的__call__
屬性,我可以檢查前一個鏈是否已經被處理,並作出相應的反應。我已經計劃擁有一個單獨的渲染方法---在處理完所有鏈之後也可以處理前一個鏈,所以它適用於我的特定場景。
類看起來是這樣的:
class Chainable:
current_chain_data = None
processed_chains = list()
def __call__(self, data):
if self.current_chain_data:
self.process()
#Some logic
self.current_chain_data = data
return self
def method_a(self, data):
#Some logic
self.current_chain_data = data
return self
def method_b(self, data):
#...
def process(self, data):
#do stuff
self.processed_chains.append(self.current_chain_data)
self.current_chain_data = None
def render(self):
if self.current_chain_data:
self.process()
for c in self.processed_chains:
output += c
return output
,並使用類似:
3210
「如果可能,我想盡量避免。」請不要。顯式比隱式更好。 – 2012-03-17 17:45:19
我看到你來自哪裏,對於像我上面發佈的一個簡單示例,我完全同意。但是,對於我的用法,關鍵目標是(儘可能準確地)維護非Python腳本語言的熟悉語法。 – 2012-03-17 17:54:45
我建議你的解決方案可能會混淆你的用戶,因爲它是不統一的。如果在調用'c'前有人在'c'上調用另一個方法會發生什麼?你的用戶會期待這種行爲嗎? – Marcin 2012-03-20 10:31:32