Python デコレータの仕組みと自作方法

デコレータは関数を受け取り、新しい関数を返す仕組みです。既存の関数に機能を追加したいとき、元のコードを変更せずに拡張できます。

デコレータの基本構造

デコレータは「関数を引数に取り、関数を返す関数」です。

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("関数実行前")
        result = func(*args, **kwargs)
        print("関数実行後")
        return result
    return wrapper

この my_decorator を使うには、@ 記法を使います。

@my_decorator
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")

実行結果は以下のようになります。

関数実行前
Hello, Alice!
関数実行後

@ 記法は糖衣構文であり、greet = my_decorator(greet) と同じ意味です。

実用的なデコレータの例

実行時間を計測するデコレータを作ってみましょう。

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        print(f"{func.__name__} の実行時間: {end - start:.4f}")
        return result
    return wrapper

@timer
def slow_function():
    time.sleep(1)
    return "完了"

デコレータを使うことで、計測ロジックを関数本体から分離できます。ログ出力、認証チェック、キャッシュなど、横断的な関心事を扱うのに適しています。