Python のデコレータは、ソース コードを変更せずに関数やメソッドの動作を変更できる強力なツールです。これらは機能を追加するためのクリーンな方法を提供し、ロギング、ルールの適用、パフォーマンスの最適化に広く使用されています。
この投稿では、6 つの一般的な Python デコレータを簡単な例とともに見ていきます。
1 - @staticmethod: 静的メソッドを定義します
@staticmethod デコレーターは、インスタンス (self) またはクラス (cls) データにアクセスしないメソッドを作成します。通常の関数のように動作しますが、クラスまたはインスタンスから呼び出すことができます。
例:
class MyClass: @staticmethod def greet(): return "Hello from static method!"
2 - @classmethod: クラスメソッドの定義
@classmethod デコレーターを使用すると、クラス (cls) を最初の引数として受け取るメソッドを定義できます。これは、ファクトリ メソッドやクラスの状態を変更する場合に便利です。
例:
class MyClass: count = 0 @classmethod def increment_count(cls): cls.count += 1
3 - @property: 読み取り専用属性を定義します
@property デコレーターを使用すると、属性と同様にメソッドにアクセスできます。内部実装を公開せずにプロパティへのアクセスを制御したい場合に便利です。
例:
class Circle: def __init__(self, radius): self._radius = radius @property def area(self): return 3.14 * self._radius ** 2
4 - @functools.lru_cache: 高価な関数の結果をキャッシュします
@lru_cache デコレーター (functools から) は、再計算を避けるために関数呼び出しの結果をキャッシュします。これにより、高価な関数や頻繁に呼び出される関数のパフォーマンスが大幅に向上します。
例:
from functools import lru_cache @lru_cache(maxsize=32) def expensive_computation(x): return x ** 2
5 - @functools.wraps: カスタム デコレータでメタデータを保持する
カスタム デコレータを作成する場合、@wraps デコレータは元の関数のメタデータ (名前、docstring) を保持し、イントロスペクション ツールが引き続き動作することを保証します。
例:
from functools import wraps def my_decorator(func): @wraps(func) def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper
6 - @dataclass: クラス定義の簡素化
@dataclass デコレータ (dataclasses モジュールから) は、クラスの init() や repr() などのメソッドを自動的に生成します。データを保持するクラスに最適です。
例:
from dataclasses import dataclass @dataclass class Point: x: int y: int
結論
@staticmethod、@classmethod、@property、@lru_cache、@wraps、@dataclass などの Python デコレータは、メソッドや関数の周囲に機能をラップすることで、よりクリーンで効率的なコードを作成するのに役立ちます。これらは、多くのプログラミング タスクを簡素化できる多用途ツールです。
出典
Python デコレータの定義
@静的メソッド
@クラスメソッド
@プロパティ
@functools.lru_cache
@functools.wraps
@dataclass
以上がPython デコレータ: コードを簡素化するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。