ホームページ >バックエンド開発 >Python チュートリアル >Python デコレーター: 機能強化への理解をさらに深める
基本を超えてデコレータを深く理解しましょう。デコレーターは単なる「追加レイヤー」ではなく、関数に機能を動的に追加する洗練された方法を提供し、関数を高度に適応性と強力なものにします。
本質的に、デコレーターは高階関数であり、別の関数を引数として受け取り、機能を追加し、新しい関数を返す関数です。これにより、元の関数を変更せずに、追加機能で元の関数を「装飾」することができます。
構文の要約:
@decorator_name def my_function(): pass
my_function の前に @decorator_name を使用すると、以下の短縮形になります:
my_function = decorator_name(my_function)
関数が呼び出されたときにログを記録する単純なデコレーターを構築してみましょう。
def log_call(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__}") return func(*args, **kwargs) return wrapper @log_call def greet(name): print(f"Hello, {name}!") greet("Alice") # Outputs: Calling greet, then Hello, Alice!
デコレータは一般的に次の目的で使用されます。
デコレータには追加のパラメータが必要な場合があります。このような場合、外部関数を追加してパラメータをデコレータに渡します。
例:
def repeat(times): def decorator(func): def wrapper(*args, **kwargs): for _ in range(times): func(*args, **kwargs) return wrapper return decorator @repeat(3) def say_hello(): print("Hello!") say_hello() # Outputs "Hello!" three times
ここで、repeat は、times 引数に基づいてデコレータを生成するデコレータ ファクトリです。
単一の関数に複数のデコレータをスタックして、強力な動作チェーンを作成できます。
例:
def make_bold(func): def wrapper(): return "<b>" + func() + "</b>" return wrapper def make_italic(func): def wrapper(): return "<i>" + func() + "</i>" return wrapper @make_bold @make_italic def greet(): return "Hello!" print(greet()) # Outputs: <b><i>Hello!</i></b>
@make_bold と @make_italic のラップを重ねると、太字と斜体の両方のタグで挨拶が表示されます。
関数を装飾する場合、多くの場合、元の関数のメタデータ (関数の名前やドキュメント文字列など) を保持したいことがあります。 functools.wraps を使用して、ラッパーがこれらの詳細を上書きしないようにしてください。
from functools import wraps def log_call(func): @wraps(func) def wrapper(*args, **kwargs): print(f"Calling {func.__name__}") return func(*args, **kwargs) return wrapper
@wraps(func) は、func の名前と docstring が確実に保持されるようにします。
デコレータはスタンドアロン関数のためだけのものではありません。クラスメソッドと一緒に使用することもできます。
例:
@decorator_name def my_function(): pass
require_auth デコレータは、access_dashboard メソッドへのアクセスを許可する前に、ユーザーが認証されているかどうかを確認します。
デコレータは Python の非常に貴重な部分であり、柔軟で再利用可能な方法で関数の動作を強化、変更、制御することができます。これらにより、コードがより表現力豊かになり、モジュール化され、エレガントになります。デコレータを使用すると、機能を追加するだけでなく、コードベースを洗練し、充実させることができます。
以上がPython デコレーター: 機能強化への理解をさらに深めるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。