1. ホーム
  2. python

[解決済み] クラス内のPythonデコレータ

2022-03-07 03:35:44

質問

のような書き方は可能でしょうか?

class Test(object):
    def _decorator(self, foo):
        foo()

    @self._decorator
    def bar(self):
        pass

これは失敗です:@selfのselfが不明です

も試してみました。

@Test._decorator(self)

も失敗します。テストは不明です

インスタンス変数を一時的に変更したい。 でデコレータを実行し、デコレートされたメソッドを実行してから を変更し、元に戻す。

どのように解決するのですか?

このようなもので良いのでしょうか?

class Test(object):
    def _decorator(foo):
        def magic( self ) :
            print "start magic"
            foo( self )
            print "end magic"
        return magic

    @_decorator
    def bar( self ) :
        print "normal call"

test = Test()

test.bar()

これにより、デコレータにアクセスするための self の呼び出しを回避し、 通常のメソッドとしてクラスの名前空間に隠蔽された状態にすることができます。

>>> import stackoverflow
>>> test = stackoverflow.Test()
>>> test.bar()
start magic
normal call
end magic
>>> 


は、コメント中の質問に答えるために編集されました。

hidden デコレーターを別のクラスで使用する方法

class Test(object):
    def _decorator(foo):
        def magic( self ) :
            print "start magic"
            foo( self )
            print "end magic"
        return magic

    @_decorator
    def bar( self ) :
        print "normal call"

    _decorator = staticmethod( _decorator )

class TestB( Test ):
    @Test._decorator
    def bar( self ):
        print "override bar in"
        super( TestB, self ).bar()
        print "override bar out"

print "Normal:"
test = Test()
test.bar()
print

print "Inherited:"
b = TestB()
b.bar()
print

出力します。

Normal:
start magic
normal call
end magic

Inherited:
start magic
override bar in
start magic
normal call
end magic
override bar out
end magic