26

関数に鈍い繰り返しパターンを持つクラスがあり、このパターンをデコレータに変えたいと思いました。しかし問題は、このデコレーターが現在のインスタンスのいくつかの属性にアクセスする必要があることです。そのため、このデコレーターをこのクラスのメソッドに変換したいと考えました。私はそれにいくつかの問題を抱えています。

だから、これは私が望むものに似ています:

class DullRepetitiveClass:
    def __init__(self, nicevariable):
        self.nicevariable = nicevariable

    def mydecorator(self, myfunction):
        def call(*args, **kwargs):
            print "Hi! The value of nicevariable is %s"%(self.nicevariable,)
            return myfunction(*args, **kwargs)
        return call

    @mydecorator            #Here, comment (1) below.
    def somemethod(self, x):
        return x + 1

(1) ここに問題があります。DullRepetitiveClass.mydecoratorメソッドを装飾するためにメソッドを使用したいsomemethod。しかし、現在のインスタンスのメソッドをデコレータとして使用する方法がわかりません。

これを行う簡単な方法はありますか?

編集:わかりました、答えは非常に明白です。Sven が以下に述べているように、デコレータ自体はメソッドを変換するだけです。メソッド自体は、インスタンスに関するすべてのことを処理する必要があります。

def mydecorator(method):
    def call(self, *args, **kwargs):
        print "Hi! The value of nicevariable is %s"%(self.nicevariable,)
        return method(self, *args, **kwargs)
    return call


class DullRepetitiveClass:
    def __init__(self, nicevariable):
        self.nicevariable = nicevariable

    @mydecorator            
    def somemethod(self, x):
        return x + 1
4

1 に答える 1

18

デコレーターは、装飾する関数またはメソッドの 1 つのパラメーターのみを取得します。パラメータとしてインスタンスが渡されることはありませんself。デコレータが呼び出された時点では、クラスのインスタンスは言うまでもなく、クラスも作成されていません。selfインスタンスは装飾された関数の最初の引数として渡されるため、 のパラメーター リストに最初のパラメーターとして含める必要がありますcall()

クラススコープにデコレータを含める必要があるとは思いません。これを行うことはできますが、モジュール スコープで行うこともできます。

于 2012-07-31T13:01:46.727 に答える