Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの@演算子(デコレータ)とは?仕組みと使い方をわかりやすく解説

Pythonにおける@演算子の役割

Pythonでは、@記号デコレータを定義するために使用されます。デコレータは、高階関数を呼び出すためのシンプルで読みやすい構文を提供します。定義上、デコレータとは「別の関数を受け取り、その関数本体を明示的に変更することなく、元の関数の振る舞いを拡張する関数」のことです。

デコレータの2つの種類

Pythonのデコレータには、主に以下の2種類があります。

  • 関数デコレータ(Function Decorators) — 関数に対して適用される
  • クラスデコレータ(Class Decorators) — クラスに対して適用される

デコレータの基本的な仕組み

Pythonにおけるデコレータは、関数やクラスを修飾(変更)する目的で使われる、あらゆる呼び出し可能(callable)なPythonオブジェクトです。関数またはクラスへの参照がデコレータに渡されると、デコレータは変更済みの関数やクラスを返します。この変更された関数やクラスには、通常、元の関数を呼び出す処理が内部に含まれています。

デコレータの基本構文は次のとおりです。

@decorator
def f(argument):
    ...

この記述により、関数 fdecorator(f) で置き換えられます。つまり、その後に f(argument) を呼び出すことは、decorator(f)(argument) を呼び出すことと完全に同等になるのです。

具体的な使用例

実際によく使われるのが、処理時間の計測やログ出力などの共通機能を複数の関数に付加するパターンです。以下は、関数の実行時間を計測するシンプルなデコレータの例です。

import functools
import time

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        print(f"{func.__name__} の実行時間: {end - start:.4f}秒")
        return result
    return wrapper

@timer
def slow_function():
    time.sleep(1)

slow_function()
# 出力例: slow_function の実行時間: 1.0012秒

このように@演算子を使うことで、関数の本体コードを汚さずに、再利用性の高い形で機能を追加できます。標準ライブラリにも functools.lru_cachestaticmethodclassmethod など、便利なデコレータが多数用意されています。

  1. Pythonの名前空間とは?仕組みとスコープの関係をわかりやすく解説

    Pythonにおける名前空間の基本名前空間(namespace)とは、変数名とオブジェクトを対応付ける仕組みであり、スコープ(名前の有効範囲)を実現するための基盤となるものです。Pythonでは、パッケージ、モジュール、クラス、関数、メソッドなど、それぞれが独自の「名前空間」を持ち、その中で変数名が解決されます。名前空間の生成と破棄関数やモジュール、パッケージが評価されて実行が始まると、そのための新しい名前空間が作成されます。これは「評価コンテキスト」と捉えると理解しやすいでしょう。そして、関数などの実行が終了すると、その名前空間は破棄され、そこに含まれていた変数も一緒に消えます。さらに、ロー

  2. Pythonの無名関数(ラムダ式)とは?基本構文と実用的な使い方をわかりやすく解説

    Pythonにおける無名関数とは Pythonにおける無名関数(匿名関数)とは、その名のとおり「関数名を持たない関数」のことです。通常の関数は def キーワードを使って定義しますが、無名関数は lambda キーワードを使って定義します。このため、無名関数は「ラムダ関数」あるいは「ラムダ式」とも呼ばれています。 ラムダ式の基本的な構文 ラムダ式は次のような形式で記述します。 lambda 引数: 式 引数を受け取り、コロン(:)以降の式の評価結果を自動的に返り値として返します。return 文を書く必要がない点が特徴です。 # 通常の関数定義 def square(x): ret