Python の
Decorator は、関数の機能を強化し、より柔軟で拡張可能にするように設計された高階関数です。この記事では、Python のデコレータについて詳しく説明し、読者がデコレータをよりよく理解して適用できるようにします。
1. デコレータとは何ですか?
デコレータは、元の関数コードを変更せずに、ユーザーが関数の動作を動的かつ透過的に変更したり、関数の機能を追加したりできるようにする Python 言語の機能です。デコレータは本質的に、他の関数をパラメータとして受け取り、新しい関数を返す関数です。
2. デコレータの構文
デコレータの構文は次のとおりです:
@decorator def foo(): pass
このうち、decorator
はデコレータ関数 ## です。 #foo は通常の関数です。
@decorator 構文を使用すると、Python インタープリターは自動的に
foo 関数を
decorator 関数に渡し、
decorator 関数を返します。値は
foo 関数に割り当てられるため、
foo 関数を呼び出すことで変更された関数を呼び出すことができます。
def log(func): def wrapper(*args, **kwargs): print(f"calling {func.__name__} with args={args}, kwargs={kwargs}") return func(*args, **kwargs) return wrapper @log def add(x, y): return x + y add(1, 2) # 输出 calling add with args=(1, 2), kwargs={} # 输出 3
def authenticate(func): def wrapper(*args, **kwargs): if authenticated: return func(*args, **kwargs) else: raise Exception("未授权") return wrapper @authenticate def get_secret_data(): pass
cache = {} def memoize(func): def wrapper(*args): if args in cache: return cache[args] else: result = func(*args) cache[args] = result return result return wrapper @memoize def fib(n): if n < 2: return n else: return fib(n-1) + fib(n-2)
class Component: def operation(self): pass class ConcreteComponent(Component): def operation(self): return "具体组件的操作" class Decorator(Component): def __init__(self, component): self._component = component def operation(self): return self._component.operation() class ConcreteDecoratorA(Decorator): def added_behavior(self): return "具体装饰器A的操作" def operation(self): return f"{self.added_behavior()},然后{self._component.operation()}" class ConcreteDecoratorB(Decorator): def added_behavior(self): return "具体装饰器B的操作" def operation(self): return f"{self.added_behavior()},然后{self._component.operation()}" component = ConcreteComponent() decoratorA = ConcreteDecoratorA(component) decoratorB = ConcreteDecoratorB(decoratorA) print(decoratorB.operation()) # 输出 具体装饰器B的操作,然后具体装饰器A的操作,然后具体组件的操作
Component は抽象コンポーネント クラス、
ConcreteComponent は具象コンポーネント クラス、
Decorator は抽象デコレータ クラス、
ConcreteDecoratorA と
ConcreteDecoratorB は具体的なデコレータ クラスです。
以上がPython のデコレータを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。