Python 3 で関数デコレータを作成し、それらを連鎖させる方法は?

PYTHON3 チュートリアル

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の関数デコレータは、コードの再利用性を高め、コードの可読性を向上させるのに有効なツールです。複数のデコレータを組み合わせることで、さらに強力なカスタマイズが可能になります。

購読
通知
0 Comments
Inline Feedbacks
View all comments