print "[%s] %s() が呼び出されました" % ( ctime(),func.__name__)
return func()
return timef
@ftfunc
def foo():
print 'hello'
if __name__ == '__main__':
foo()
sleep(2)
for i in range(2):
sleep(1)
foo()
このコードを実行すると、ターミナルが次のように出力することがわかります。
ftfunc 関数は、私たちが独自に定義した関数です。この関数はパラメータとして関数を受け取ります。上記によれば、同等の変換ルールがあります。コード
コード
をコピーします。 コードは次のとおりです。
@ftfunc
def foo() : print 'hello' は次のコードに変換できます:
コードをコピー
コードは次のとおりです:
def foo():
print 'hello' foo = ftfunc(foo) 上記の元のコードと組み合わせると、すぐに役割を実現できますデコレーターの。
しかし、このコードを書いたときにタイプミスをしてしまいました:
このコード:
コードをコピー
コードは次のとおりです。次のように:
return func()
return timef は私が書きました:
コードをコピーします
コードは次のとおりです。
return func
return timef したがって、出力結果は異なりますが、最終的に重要な概念: 「foo」は関数オブジェクトへの参照であり、「foo()」は関数オブジェクトへの呼び出しです。オブジェクト参照は Python の重要な基本概念です。Python ではすべてがオブジェクトであり、型は変数ではなくオブジェクトに属します。すべての変数はオブジェクトへの参照にすぎません。これは、変数にオブジェクトを指すようにすることと同じです。 「foo」は変数として理解できますが、関数のオブジェクトを指します。そして、「foo()」は関数オブジェクトの呼び出しです。つまり、このオブジェクトを呼び出すことは、この関数の関数を実行することになります。ここではゆっくりと味を理解する必要があります。これに基づきます:
このようなコードを実行した結果は、前とまったく同じです。先ほどのコードとの違いを比較すると理解しやすくなります。
コードをコピー
コードは次のとおりです:
# -*-coding: utf-8 -*-
from time import ctime from time import sleep def ftfunc(func): def timef(): print "[%s] %s() が呼び出されました" % (ctime(),func .__name__)
return func
return timef
@ftfunc
def foo():
print 'hello'
if __name__ == '__main__':
foo()()
sleep(2)
for i in range(2):
sleep(1)
foo()()
このコードの実行結果:
実際、返された timef 関数にかっこを追加して、結果がどのようになるかを確認することもできます。 Python の関数の概念をよりよく理解できます。