デコレータは関数を受け取り、新しい関数を返す仕組みです。既存の関数に機能を追加したいとき、元のコードを変更せずに拡張できます。
デコレータの基本構造
デコレータは「関数を引数に取り、関数を返す関数」です。
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 "完了"
デコレータを使うことで、計測ロジックを関数本体から分離できます。ログ出力、認証チェック、キャッシュなど、横断的な関心事を扱うのに適しています。