Pythonのデコレータは、他の関数やクラスを変更する、またはその動作を拡張するための特殊な種類の関数やクラスです。デコレータは、被デコレートされる関数やクラスの上に @
記号を使用して適用されます。
デコレータの基本的なアイディアは、一つの関数を取り、それを何らかの形で変更したり拡張したりした後に、新しい関数を返すことです。
基本的なデコレータの例
以下は非常にシンプルなデコレータの例です:
def simple_decorator(func):
def wrapper():
print("Before the function call")
func()
print("After the function call")
return wrapper
@simple_decorator
def say_hello():
print("Hello!")
say_hello()
このコードを実行すると以下のような出力が得られます:
Before the function call
Hello!
After the function call
この例では、simple_decorator
は実際のsay_hello
関数を取り、新しいwrapper
関数に包み込んで返しています。wrapper
関数は、元の関数を呼び出す前後で追加の処理(この場合はprint文)を実行します。
デコレータと引数
デコレータは、引数を取る関数に対しても使用することができます。これを実現するには、wrapper
関数が任意の数の位置引数やキーワード引数を受け取るようにする必要があります。以下はその例です:
decorator
def simple_decorator(func):
def wrapper(*args, **kwargs):
print("Before the function call")
result = func(*args, **kwargs)
print("After the function call")
return result
return wrapper
@simple_decorator
def greet(name):
print(f"Hi, {name}!")
greet("Alice")
このように、デコレータを使用すると、関数の動作を変更することなく、その前後に追加の動作を簡単に挿入することができます。これは、ロギング、計測、アクセス制御、メモ化など、さまざまな用途で役立ちます。
Pythonの標準ライブラリには、functools
というモジュールが含まれており、これにはデコレータの作成をサポートするユーティリティ(例えばwraps
)があります。