Python では、関数を定義するときに @func を使用することがよくあります。これは、関数をパラメーターとして受け取る関数であり、既存の関数を拡張するためによく使用されます。現在の関数の状態を変更します。
このような関数があり、この関数がいつ開始され、いつ終了するかを知りたいのですが、次のように書く必要があります
。ただし、関数の変更が許可されていない場合は、デコレーターが必要です
例:
関数には __name__ オブジェクトがあり、これは dir(func) func で定義できます
デコレーターを通じてログを印刷します
実際、デコレーターで変更された関数は、now = log(now) と同等です。つまり、デコレーター関数は、変更された関数をパラメーターとして受け取り、それを同じ名前の変数に割り当てます
functools.wraps関数
デコレーターを使用すると、__name__ の値が変更されます
デコレータを使用すると、now.__name__ は現在の now 関数を使用しますが、使用後の now 関数は実際には log 関数とラップされたラッパーの戻り値である log(now) になります。解決策は functools です。関数をラップします。
デコレーションクロージャー、使用前に import functools を呼び出す必要があります
パラメータ付きデコレータ
デコレータがパラメータを渡す必要がある場合は、デコレータを返す高階関数を作成する必要があります。作成はより複雑です。
リーリー
デコレータークラス
クラスの __call__ を通じて、クラスを関数のように使用できますリーリー