【Python】デコレーターとはなにものか

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)があります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です