Python デコレータの基本

PythonBeginner
オンラインで実践に進む

はじめに

Python のデコレータを使うと、関数、クラス、またはメソッドの動作を変更または強化できます。これは、ソースコードを変更することなく、コードの機能を動的に変更する方法です。この実験では、デコレータの基本と、コードに機能を追加するための使い方を学びます。

デコレータの理解

まずは簡単な例から始めましょう。新しい Python インタプリタセッションを開きます。

python3

数値の二乗を計算する関数があります。

def square(x):
    return x**2

ここで、square 関数に、関数が呼び出されるたびに入力と出力をログに記録する機能を追加したいとしましょう。これはデコレータを使って行うことができます。

logger デコレータのコードは次の通りです。

def logger(func):
    def wrapper(x):
        print("Calling function:", func.__name__)
        print("Input:", x)
        result = func(x)
        print("Output:", result)
        return result
    return wrapper

これで、このデコレータを使って square 関数を強化できます。

@logger
def square(x):
    return x**2

square(5) を呼び出すと、出力は次のようになります。

Calling function: square
Input: 5
Output: 25

ご覧の通り、デコレータは square 関数のソースコードを変更することなく、望ましい機能を追加しました。

パラメータ付きのデコレータ

デコレータはまた、パラメータを受け取ることもできます。たとえば、入力と出力のログの前に表示するメッセージを受け取るように logger デコレータを変更することができます。

def logger(message):
    def decorator(func):
        def wrapper(x):
            print(message)
            print("Calling function:", func.__name__)
            print("Input:", x)
            result = func(x)
            print("Output:", result)
            return result
        return wrapper
    return decorator

これで、この更新されたデコレータを使って square 関数を強化できます。

@logger("This is a custom message")
def square(x):
    return x**2

square(5) を呼び出すと、出力は次のようになります。

This is a custom message
Calling function: square
Input: 5
Output: 25

複数のデコレータの使用

複数のデコレータを重ねて使用することもでき、複数レベルの機能を追加できます。たとえば、関数の実行にかかる時間を測定する timer という新しいデコレータを作成しましょう。

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print("Time elapsed:", end_time - start_time)
        return result
    return wrapper

これで、square 関数に loggertimer の両方のデコレータを使用しましょう。

@logger("This is a custom message")
@timer
def square(x):
    return x**2

square(5) を呼び出すと、出力は次のようになります。

This is a custom message
Calling function: square
Input: 5
Output: 25
Time elapsed: 0.000001

ご覧の通り、timer デコレータは square 関数に経過時間の情報を追加し、logger デコレータは入力と出力のログとカスタムメッセージを追加しています。

まとめ

この実験では、Python におけるデコレータの基本を学びました。関数、クラス、またはメソッドの動作を変更するためにデコレータをどのように使用するか、および複数のレベルの機能を追加するために複数のデコレータをどのように使用するかを見てきました。また、カスタム機能を追加するためにパラメータ付きのデコレータをどのように使用するかも見てきました。

これらのスキルを使えば、開発者としての生活をより楽にするために、コードにデコレータを組み込み始めることができます!