デコレータは Python の重要な部分です。 簡単に言えば、これらは他の関数の機能を変更する関数です。これらはコードを短くし、より Python らしくするのに役立ちます。
#Python のデコレータを理解したい場合は、まずクロージャの概念を理解する必要があります。 (推奨学習: Python ビデオ チュートリアル )
コンピュータ サイエンスでは、クロージャ (英語: Closure)、字句クロージャ (Lexical Closure) または関数クロージャ (関数クロージャ) とも呼ばれます。は自由変数を参照する関数です。参照された自由変数は、関数が作成された環境を離れた後も関数とともに残ります。
Decorator
通常のデコレータは次のようになります:
import functools def log(func): @functools.wraps(func) def wrapper(*args, **kwargs): print('call %s():' % func.__name__) print('args = {}'.format(*args)) return func(*args, **kwargs) return wrapper
これは、メソッド名とそのパラメータを出力するデコレーションを定義します。
これを呼び出すには、 は @ で始まる必要があります:
@logdef test(p): print(test.__name__ + " param: " + p) test("I'm a param")
出力:
call test(): args = I'm a param test param: I'm a param
デコレータが使用される場合、@ 構文は次のとおりです。中古ですが、ちょっと面倒です。 実際、デコレータは単なるメソッドであり、次の呼び出しメソッドと何ら変わりはありません:
def test(p): print(test.__name__ + " param: " + p) wrapper = log(test) wrapper("I'm a param")
@構文は関数をデコレータ関数に渡すだけです。それについては魔法のようなものは何もありません。
@functools.wraps(func) に注目してください。これは、Python によって提供されるデコレーターです。元の関数のメタ情報をデコレータ内の func 関数にコピーできます。関数のメタ情報には、docstring、名前、パラメータ リストなどが含まれます。
@functools.wraps(func) を削除してみると、test.__name__ の出力がラッパーになることがわかります。
Python 関連の技術記事の詳細については、Python チュートリアル 列にアクセスして学習してください。
以上がPython デコレーターは何から始めますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。