概要

Pythonのデコレータは、関数に新たな機能を追加する強力な手段です。特定の関数の前後に追加処理を行いたいときに役立ちます。さらに、複数のデコレータをチェーンすることで、柔軟なコードの再利用が可能になります。本記事では、デコレータの作成方法から、デコレータをチェーンする方法までを解説します。

デコレータの基本

デコレータは、関数を引数として受け取り、その関数をラップして新しい関数を返す構造です。これにより、元の関数に追加のロジックを注入することができます。 以下は、シンプルなデコレータの例です。

def my_decorator(func):
    def wrapper():
        print("関数の前処理")
        func()
        print("関数の後処理")
    return wrapper
@my_decorator
def say_hello():
    print("こんにちは")
say_hello()

実行結果:

関数の前処理
こんにちは
関数の後処理

このように、@my_decoratorを使用すると、say_hello()を実行する前後に追加処理を挟むことができます。

複数のデコレータをチェーンする

複数のデコレータを適用する場合、それらは上から下へ順に適用されます。

複数デコレータの例

def make_bold(func):
    def wrapper():
        return "<b>" + func() + "</b>"
    return wrapper
def make_italic(func):
    def wrapper():
        return "<i>" + func() + "</i>"
    return wrapper
@make_bold
@make_italic
def say():
    return "こんにちは"
print(say())

実行結果:

<b><i>こんにちは</i></b>

この例では、say()関数はまずmake_italicデコレータでラップされ、その後にmake_boldでラップされます。そのため、最終的な出力は<b><i>こんにちは</i></b>となります。

デコレータの応用

デコレータは関数だけでなく、メソッドやクラスにも適用できます。また、関数の引数や戻り値に依存する柔軟な処理を追加することも可能です。

引数を取るデコレータの例

def repeat(num):
    def decorator(func):
        def wrapper(*args, kwargs):
            for _ in range(num):
                func(*args, kwargs)
        return wrapper
    return decorator
@repeat(3)
def greet(name):
    print(f"こんにちは、{name}さん")
greet("太郎")

この例では、greet関数が3回実行されます。

結論

Pythonのデコレータは、コードを簡潔かつ強力にするための素晴らしいツールです。デコレータを使うことで、関数に追加の機能を持たせたり、複数のデコレータを組み合わせてより柔軟な処理を実装することができます。特に、再利用可能なコードの作成や、前後処理の簡略化に大いに役立ちます。