<< home

Pythonのデコレーター

デコレーター(Decorator)は、関数の前後に処理を追加するための便利な機能です。コードの可読性を保ちつつ、関数の動作を拡張できます。


1. デコレーターとは?

デコレーターは、関数を引数として受け取り、新しい機能を追加した関数を返す仕組みです。Pythonでは@デコレーター名という構文を使って関数に適用します。

基本形

def my_decorator(func): def wrapper(): print("処理の前") func() print("処理の後") return wrapper @my_decorator # デコレーターの適用 def say_hello(): print("こんにちは!") say_hello()

実行結果

処理の前 こんにちは! 処理の後

2. 引数を持つ関数のデコレーター

デコレーターを適用する関数が引数を持つ場合は、*args, **kwargsを使って柔軟に対応できます。

def my_decorator(func): def wrapper(*args, **kwargs): print("処理の前") result = func(*args, **kwargs) print("処理の後") return result return wrapper @my_decorator def add(a, b): return a + b print(add(3, 5))

実行結果

処理の前 処理の後 8

3. 複数のデコレーターを適用する

デコレーターは複数適用できます。適用順は**下から上へ(内側から外側へ)**です。

def deco1(func): def wrapper(): print("deco1") func() return wrapper def deco2(func): def wrapper(): print("deco2") func() return wrapper @deco1 @deco2 def greet(): print("こんにちは!") greet()

実行結果

deco1 deco2 こんにちは!

4. デコレーターの実用例

1. 実行時間を計測するデコレーター

import time def timer(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"実行時間: {end_time - start_time:.4f}秒") return result return wrapper @timer def slow_function(): time.sleep(2) print("処理が完了しました") slow_function()

2. 権限チェックを行うデコレーター

def check_admin(func): def wrapper(user): if user != "admin": print("アクセス権がありません!") return return func(user) return wrapper @check_admin def secret_data(user): print("機密情報を表示します") secret_data("guest") # アクセス権がありません! secret_data("admin") # 機密情報を表示します

5. クラスをデコレーターとして使う

関数だけでなく、クラスもデコレーターとして利用可能です。

class Repeat: def __init__(self, times): self.times = times def __call__(self, func): def wrapper(*args, **kwargs): for _ in range(self.times): func(*args, **kwargs) return wrapper @Repeat(3) def hello(): print("こんにちは!") hello()

実行結果

こんにちは! こんにちは! こんにちは!

6. まとめ

デコレーターを活用すれば、コードをシンプルに保ちつつ、再利用性の高いプログラムを作ることができます!


<< home