デコレーターとは
デコレーターは、関数を修飾する関数です。これにより、関数を書き換えることなく、その関数に処理を追加したり、変更したりすることができます。
デコレーターを使わない例
まず、デコレーターを使わない例を見てみましょう。
def add(a, b):
print(a + b)
print('Start!!')
add(1, 2)
print('Finish!!')
print('Start!!')
add(3, 4)
print('Finish!!')
このコードでは、add
関数を呼び出す前後に同じメッセージを表示しています。
デコレーターの使用例
次に、デコレーターを使って上記の処理を簡略化する例を見てみましょう。
# デコレーター関数を定義
def my_decorator(func):
def wrapper(a, b):
print('Start!!')
func(a, b)
print('Finish!!')
return wrapper
# 通常の関数
def add(a, b):
print(a + b)
# デコレーターを手動で適用
add_result = my_decorator(add)
print(add_result) # <function my_decorator.<locals>.wrapper at 0x...>
# デコレーターが追加された関数を実行
add_result(1, 2)
add_result(3, 4)
デコレーターの簡略化
デコレーターを関数の上に直接書くこともできます。これにより、デコレーターの適用が簡単になります。
# デコレーター関数を定義
def my_decorator(func):
def wrapper(a, b):
print('Start!!')
func(a, b)
print('Finish!!')
return wrapper
# デコレーターを使用して関数を修飾
@my_decorator
def add(a, b):
print(a + b)
# 修飾された関数を実行
add(1, 2)
add(3, 4)
汎用性の高いデコレーター
引数が固定されていると汎用性が低くなるため、可変長引数(*args
)と可変長キーワード引数(**kwargs
)を使って、どんな関数にも使えるようにします。
# 汎用性の高いデコレーター関数を定義
def my_decorator(func):
def wrapper(*args, **kwargs):
print('Start!!')
func(*args, **kwargs)
print('Finish!!')
return wrapper
# デコレーターを使用して関数を修飾
@my_decorator
def add1(a, b):
print(a + b)
@my_decorator
def add2(c, d, e):
print(c + d + e)
# 修飾された関数を実行
add1(1, 2)
add2(3, 4, 5)
まとめ
デコレーターを使うことで、関数の前後に共通の処理を追加することが簡単にできます。これにより、コードの再利用性が高まり、可読性も向上します。