以下は、自己(現在のオブジェクトインスタンス)Pythonのデコレータは、自己
class Test(object):
def __init__(self):
self.x = 5
def _change_x(self):
print "in _change_x"
def decorator(f):
print "in decorator"
def wrapped(*args, **kwargs):
print "in wrapped"
print args, kwargs
self.x = 8
f(*args, **kwargs)
return wrapped
return decorator
@_change_x
def print_x(self):
print "in print_x, x: %d" % self.x
return self.x
if __name__ == "__main__":
test = Test()
print "Initial value for x: %d" % test.x
print "Test if it changed? x: %d" % test.print_x()
変更することができ、クラスメソッドのデコレータを持って私のテストコードでありますデコレータにラップされた内部メソッドが呼び出されていません。私のテストコードで間違いを指摘する手助けをすることができます。 クラス内で定義されたこの種のデコレータが必要で、呼び出し時にクラスメンバを変更するために、そのクラスのメソッドをいくつかデコレートするために使用されます。
各関数呼び出しの前にクラスメンバ(そのインスタンス用)を変更する方法は、デコレータ以外の方法を提案できますか?私は可読性のために修正が不透明であることを望んでいます。なぜ、私がクラスメソッドの始めにそれらを修正していないのですか? – RPM
関数呼び出しの直前に何を変更したいのかを理解するのは少し難しいです...私は手元に問題があるかどうかはわかりませんが、これは私ができるあらゆるケースの直感的なデザインパターンのようです思うようにしてください(これは現在のユースケースではありません;-))。 – mgilson
@mgilsonは、多くのメソッド呼び出しが非常に強力なデバッグツールとなる前に余分なステップを挿入しています。単純に 'print f'はプログラムの全過程を通してどのメソッドが呼び出されているかを示します。 –