KAMEYA_WORKS
デコレーター(Decorator)は、関数の前後に処理を追加するための便利な機能です。コードの可読性を保ちつつ、関数の動作を拡張できます。
デコレーターは、関数を引数として受け取り、新しい機能を追加した関数を返す仕組みです。Pythonでは@デコレーター名
という構文を使って関数に適用します。
def my_decorator(func):
def wrapper():
print("処理の前")
func()
print("処理の後")
return wrapper
@my_decorator # デコレーターの適用
def say_hello():
print("こんにちは!")
say_hello()
処理の前
こんにちは!
処理の後
デコレーターを適用する関数が引数を持つ場合は、*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
デコレーターは複数適用できます。適用順は**下から上へ(内側から外側へ)**です。
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
こんにちは!
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()
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") # 機密情報を表示します
関数だけでなく、クラスもデコレーターとして利用可能です。
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()
こんにちは!
こんにちは!
こんにちは!
@デコレーター名
を使って適用できる*args, **kwargs
を使うと汎用性が高まるデコレーターを活用すれば、コードをシンプルに保ちつつ、再利用性の高いプログラムを作ることができます!