Python関数デコレータとその連鎖の解説
Pythonの関数デコレータは、関数の動作を変更するために使用される強力なツールです。デコレータは、既存の関数に新しい機能を「装飾」することができます。このブログ投稿では、Python 3で関数デコレータを作成し、それらを連鎖させる方法について説明します。
関数デコレータの基本
関数デコレータは、別の関数を引数として受け取り、その関数の前後に追加の処理を行うラッパー関数です。デコレータは、関数を変更することなく、その機能を拡張するのに役立ちます。
def my_decorator(func): def wrapper(): print("何かを実行する前に") func() print("何かを実行した後に") return wrapper @my_decorator def say_hello(): print("こんにちは!") say_hello()
デコレータの連鎖
複数のデコレータを一つの関数に適用することで、「デコレータの連鎖」を作成することができます。デコレータは、それらが適用された順序に従って実行されます。
def decorator_one(func): def wrapper(): print("デコレータ1の開始") func() print("デコレータ1の終了") return wrapper def decorator_two(func): def wrapper(): print("デコレータ2の開始") func() print("デコレータ2の終了") return wrapper @decorator_one @decorator_two def greet(): print("こんにちは、世界!") greet()
上記の例では、greet
関数に二つのデコレータが適用されています。最初に@decorator_two
が適用され、次に@decorator_one
が適用されます。この順序で実行されるため、出力は「デコレータ2の開始」、「こんにちは、世界!」、「デコレータ2の終了」、「デコレータ1の開始」、「デコレータ1の終了」となります。
デコレータを用いた実用的な例
デコレータは、関数の実行時間を計測するなど、実際のアプリケーションで役立つ多くの用途があります。
import time def timer_decorator(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"{func.__name__} は {end_time - start_time:.4f} 秒かかりました。") return result return wrapper @timer_decorator def long_running_function(): time.sleep(2) print("長い処理が完了しました!") long_running_function()
この例では、timer_decorator
を使用して関数の実行時間を計測しています。これにより、関数のパフォーマンスを評価するのに役立ちます。
以上のように、Pythonの関数デコレータは、コードの再利用性を高め、コードの可読性を向上させるのに有効なツールです。複数のデコレータを組み合わせることで、さらに強力なカスタマイズが可能になります。