2011-01-20 11 views
1

私は実行の最後に、returnステートメントの直前に同じアクションを実行する必要があるPythonオブジェクトを持っています。たとえば:多くの関数の最後で実行されるアクションを指定する

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 

は、各関数の最後に明示的な呼び出しを除き、これを行うための最善の(?ニシキヘビ)の方法は何ですか?たぶん

Explicit is better than implicit. 
+1

おそらく 'self.update_everything()'、btwでなければなりません。 – erbridge

+0

あなたはデコレータを書くことができますが、実際にはもっと多くの行のコードが必要になります。あなたはメタクラスを使うことができるかもしれませんが、それはおそらくMyClassの*すべてのメソッドがそれを常に行うことを意味し、危険なようです。 –

答えて

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

私は(ティム・ピーターズは、Pythonの禅(import this)で述べているように)ので、あなたの問題への解決策は、unpythonicだろうと思いますか?

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') 
2

他の方法でラウンド:

関連する問題