デコレータの動作について質問があります。例を使って私の問題を説明したいと思います
デコレータを理解するために実装したコード
import sys
import inspect
def entryExit(f):
def new_f(self,*args, **kwargs):
print "Entering", f.__name__,self.__class__.__name__,inspect.getargspec(f).args[1:]
f(self,*args)
print "Exited", f.__name__,self.__class__.__name__,inspect.getargspec(f).args[1:]
return new_f
class A:
@entryExit
def move(self,g,h):
print "hello"
print g,h
@entryExit
def move1(self,m,n):
print "hello"
print m,n
return m
a=A()
a.move(5,7)
h=a.move1(3,4)
print h
このコードの出力は次のとおりです。
Entering move A ['g', 'h']
hello
5 7
Exited move A ['g', 'h']
Entering move1 A ['m', 'n']
hello
3 4
Exited move1 A ['m', 'n']
None
出力の最後の行に。が表示されますNone
。ただし、メソッドの実際の意味は、デコレータを使用することによって変更されます。メソッドのreturnステートメントmove1
は実行されませんでした。実際に必要な出力は
Entering move A ['g', 'h']
hello
5 7
Exited move A ['g', 'h']
Entering move1 A ['m', 'n']
hello
3 4
Exited move1 A ['m', 'n']
3
それで、デコレータの作成中に間違いを犯したのでしょうか、それともデコレータが関数のreturnステートメントを常に無視するのでしょうか?