ホームページ  >  に質問  >  本文

Python - __call__ を使用してデコレータ関数を実装する

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

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

リーリー

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

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

某草草某草草2692日前838

全員に返信(1)返信します

  • 迷茫

    迷茫2017-06-28 09:26:02

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

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

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

    リーリー リーリー

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

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

    リーリー

    出力:

    リーリー

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

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

    返事
    0
  • キャンセル返事