Pythonデコレータの使い方学習メモ

WBOY
リリース: 2016-07-06 13:29:43
オリジナル
1296 人が閲覧しました

Python では、関数を定義するときに @func を使用することがよくあります。これは、関数をパラメーターとして受け取る関数であり、既存の関数を拡張するためによく使用されます。現在の関数の状態を変更します。

リーリー

このような関数があり、この関数がいつ開始され、いつ終了するかを知りたいのですが、次のように書く必要があります

リーリー

ただし、関数の変更が許可されていない場合は、デコレーターが必要です

リーリー

例:

リーリー

関数には __name__ オブジェクトがあり、これは dir(func) func で定義できます

リーリー

デコレーターを通じてログを印刷します

リーリー

実際、デコレーターで変更された関数は、now = log(now) と同等です。つまり、デコレーター関数は、変更された関数をパラメーターとして受け取り、それを同じ名前の変数に割り当てます

functools.wraps関数

デコレーターを使用すると、__name__ の値が変更されます

リーリー

デコレータを使用すると、now.__name__ は現在の now 関数を使用しますが、使用後の now 関数は実際には log 関数とラップされたラッパーの戻り値である log(now) になります。解決策は functools です。関数をラップします。

デコレーションクロージャー、使用前に import functools を呼び出す必要があります

リーリー

パラメータ付きデコレータ

デコレータがパラメータを渡す必要がある場合は、デコレータを返す高階関数を作成する必要があります。作成はより複雑です。

リーリー
パラメータ付きのデコレータは func = デコレータ関数 (デコレータパラメータ)(func) と同じです

デコレータークラス

クラスの __call__ を通じて、クラスを関数のように使用できます

リーリー

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート