Python - __call__ を使用してデコレータ関数を実装する
某草草
某草草 2017-06-28 09:24:02
0
1
889

次のコードに示すように、クラスの __call__ を使用してデコレーターを実装します。 リーリー

このクラスを関数を装飾するデコレータとして使用する場合。

リーリー

ここで問題が発生します。 Django またはその他の Python プロセスを開始します。この param_check ルートを実行すると、print "1111111111" は初回のみ出力され、その後呼び出された場合には 1111111111111 は出力されません。

そして、毎回「2222222222」と印刷されます。私の理解では、__call__ はこのデコレーターを初めて定義しているため、一度だけ実行され、後で再度要求されたときに定義されており、関数本体部分 (print 222222222 部分) のみが実行されます。この Python デコレーターの機能を誰が知っていますか?

某草草
某草草

全員に返信(1)
迷茫

実は、クラス デコレータを使用するときに注意すべき点があります。パラメータ付きのクラス デコレータとパラメータなしのクラス デコレータは実際には異なります。

パラメータのないクラスデコレータ

パラメーターなしでデコレーターを作成すると、デコレーターのコンストラクター (__init__) にデコレーターのメソッドが渡され、デコレーターの関数が呼び出されるときに、デコレーターの __call__() メソッドが実行されます。

リーリー リーリー

装飾フェーズでは __init__ 関数が実行され、装飾されたメソッドが呼び出されるときに __call__ が実行されることに注意してください。

パラメータを備えたクラスデコレーター

リーリー

出力:

リーリー

__call__ は装飾フェーズ中に 1 回だけ呼び出されることは明らかです

さらに詳しく知りたい場合は、こちらをご覧ください: http://www.artima.com/weblogs...

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート