5.1 デコレータの紹介
デコレータっていうのは、他の関数を引数に取って、新しい関数を返すことで元の関数の動作を変えたり拡張したりする関数だよ。コードを読みやすくしたり、再利用するために使われるんだ。
デコレータを使うと、元のコードを変えなくても関数やメソッドの動作を変えられるから、機能追加やログ取り、アクセス管理なんかに便利なんだよね。
Pythonでデコレータを使うときの構文は、関数定義の前に@マークを付けてデコレータの名前を書くんだ。
@decorator
def my_function():
pass
これは以下のコードと同じ意味だよ:
def my_function():
pass
my_function = decorator(my_function)
ここで何が起きてるかよく考えてみて: 関数my_functionを宣言してるけど、その後でdecoratorという関数で置き換えてる。そこにmy_functionを引数として渡してる。decoratorは、好きなタイミングでこのmy_functionを呼び出せるんだ。
5.2 簡単なデコレータを作ろう
簡単なデコレータを見てみよう。これは関数を呼び出す前と後にメッセージを出力するものだよ。
def my_decorator(func):
def wrapper():
print("関数を呼び出す前だよ")
func()
print("関数を呼び出した後だね")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
説明
デコレータ (my_decorator): この関数はfuncという関数を引数に受け取って、新しい関数wrapperを返す。このwrapperがfuncを呼び出す前後に追加の動作を行うんだ。
デコレータがついた関数 (say_hello): 関数say_helloはデコレータmy_decoratorでラップされているので、呼び出すときに追加の動作が入るんだ。
出力:
# 関数を呼び出す前だよ
Hello!
# 関数を呼び出した後だね
5.3 引数付きデコレータ
デコレータは引数を取ることもできて、これで動作を柔軟に調整できるんだ。
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
func(*args, **kwargs)
return wrapper
return decorator_repeat
@repeat(num_times=3)
def say_hello(name):
print(f"Hello, {name}!")
say_hello("Alice")
説明
引数付きデコレータ (repeat): この関数は引数num_timesを取って、デコレータdecorator_repeatを返す。
デコレータ (decorator_repeat): このデコレータは関数funcを受け取って、新しい関数wrapperを返す。このwrapperはfuncをnum_times回呼び出すんだ。
デコレータがついた関数 (say_hello): デコレータrepeatのおかげで、関数say_helloは3回呼び出されるんだ。
出力:
Hello, Alice!
Hello, Alice!
Hello, Alice!
GO TO FULL VERSION