何を探しているのかは明確ではありませんが、デコレーター内のインスタンスへの参照を使用できるようにしたい場合は、次のようにします。
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
、実際には、装飾されている場合でも関数のままです。インスタンスの属性ルックアップでメソッドに変換されるのは装飾された関数です。func
これは、ラッパー関数を呼び出すときに明示的な自己がまだ必要であることを意味します。
How to make a chain of function decorators? への素晴らしい回答をご覧ください。何が起こっているのかをよりよく説明するために。