ホームページ >バックエンド開発 >Python チュートリアル >Python デコレーター関数と関数パラメーターの使用法の概要

Python デコレーター関数と関数パラメーターの使用法の概要

WBOY
WBOYオリジナル
2016-06-16 08:47:101249ブラウズ

簡単に言うと、デコレーターの主な機能は関数を変更することです。クラス メソッドと静的メソッドが導入されたとき、デコレーターは静的メソッドを定義するように見えました。たとえば、 foo() 関数を静的関数

として宣言するには、コード をコピーします。コードは次のとおりです。

クラス Myclass(オブジェクト):
def staticfoo():
....
....
staticfoo = staticmethod(staticfoo)

は、デコレータ メソッドを使用して実装できます:
コードをコピー コードは次のとおりです。 🎜>
class Myclass(object ):
@staticmethod Def staticfoo():
..... 明白でわかりやすいです。

そういえば、次の例も Python の関数の本質的な理解という重要な内容を含んでいます。

コード:


コードをコピー

コードは次のとおりです:
# -*-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()


このコードを実行すると、ターミナルが次のように出力することがわかります。


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 の関数の概念をよりよく理解できます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。