2011-01-20 61 views
1

我有一個python對象,其中一組函數需要在執行結束時執行相同的動作,就在return語句之前。例如:指定要在許多函數結束時執行的動作

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

    def update_everything(self): 
     '''update everything''' 
     pass 

    def f1(self): 
     #do stuff 
     self.update_everything() 
     return result 

    def f2(self): 
     #do stuff 
     self.update_everything() 
     return result 

    def f3(self): 
     #do stuff 
     self.update_everything() 
     return result 

什麼是最好的(Python的?)的方式來做到這一點,除了在每個函數的末尾顯式調用?

+1

這應該可能是`self.update_everything()`,順便說一句。 – erbridge 2011-01-20 15:38:53

回答

3

是,使用裝飾實際上是代碼,但它的優勢在於,你可以看到一個方法一目瞭然更新的一切。這是一種不同的明確性;-)

def update_after(m): 
    """ calls self.update_everything() after method m """ 
    def decorated(self, *args, **kwargs): 
     r = m(self, *args, **kwargs) 
     self.update_everything() 
     return r 
    return decorated 


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

    def update_everything(self): 
     '''update everything''' 
     pass 

    @update_after 
    def f1(self): 
     #do stuff 
     return result 

    @update_after 
    def f2(self): 
     #do stuff 
     return result 

    @update_after 
    def f3(self): 
     #do stuff 
     return result 
6

我認爲任何解決方案,您的問題將是unpythonic,因爲(蒂姆·彼得斯說,在Python(import this)的禪):

Explicit is better than implicit. 
2

也許倒過來?

class MyClass(object): 
    def update(self, func): 
     value = func() 
     # do something common 
     return value 

    def f1(self): 
     # do stuff 
     return result 

    def f2(self): 
     # do stuff 
     return result 

my_object = MyClass() 

my_object.update(my_object.f1) 

編輯: 你也可以把它寫在update接受字符串作爲對象的方法的名稱這樣的方式。這會阻止運行其他對象的方法。

my_object.update('f1') 
相關問題