2

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"
4

1 に答える 1

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、実際には、装飾されている場合でも関数のままです。インスタンスの属性ルックアップでメソッドに変換されるのは装飾された関数です。funcこれは、ラッパー関数を呼び出すときに明示的な自己がまだ必要であることを意味します。

How to make a chain of function decorators? への素晴らしい回答をご覧ください。何が起こっているのかをよりよく説明するために。

于 2013-02-07T07:28:21.253 に答える