Pythonメンバ関数デコレータはインスタンスをパラメータとして使用します

pythonメンバ関数のデコレータでインスタンスをパラメータとして使用する方法。 以下はその例です。

def foo(func):
    def wrap(s):
        func()
        s.ma()
    return wrap

class A:
    def ma(self):
        print "this is ma"

    @foo(self)     #error.name 'self' is not defined
    def mb(self):
        print "this is mb"
2
インスタンスだけでなくクラスブロックが実行中にクラスがまだ定義されていないので、できません。これを達成するために何をしようとしているのですか?
追加された 著者 BrenBarn,
さらに、fooデコレータは引数を取るように設定されていません。 fooデコレータ関数のインスタンスへの参照をしたいだけですか? wrap のパラメータ s はインスタンスにバインドされますので、 func のように func /code>
追加された 著者 Thomas,

1 答え

探しているものは明確ではありませんが、デコレータ内のインスタンスへの参照を使用できるようにしたい場合は、次のようにします。

def foo(func):
    def wrap(s): # I'd call this 'self' instead of 's' to remind us it's a reference to an instance

        func(s) # This is a function, not a method yet - so we need to pass in the reference

        s.ma() # This is a method, because you use attribute lookup on the object s to get it
    return wrap

class A:
    def ma(self):
        print "this is ma"

    @foo     # if the way foo wraps mb doesn't depend on some arg, don't use args here
    def mb(self):
        print "this is mb"

Pythonのメソッドと関数の違いについてここでは混乱していると思います。実際には装飾されているときには関数のように機能すると期待しているようです。これは、インスタンスの属性検索時にメソッドに変換される装飾された関数です。これは、ラッパー関数で func を呼び出すときに明示的なselfが必要であることを意味します。

より良い説明については、関数デコレータの連鎖を作成するにはどうすればいいですか?を参照してください。何が起こっているのか

1
追加された