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