Python のデコレータを理解する

WBOY
リリース: 2023-06-10 12:31:37
オリジナル
2665 人が閲覧しました

Python の

Decorator は、関数の機能を強化し、より柔軟で拡張可能にするように設計された高階関数です。この記事では、Python のデコレータについて詳しく説明し、読者がデコレータをよりよく理解して適用できるようにします。

1. デコレータとは何ですか?

デコレータは、元の関数コードを変更せずに、ユーザーが関数の動作を動的かつ透過的に変更したり、関数の機能を追加したりできるようにする Python 言語の機能です。デコレータは本質的に、他の関数をパラメータとして受け取り、新しい関数を返す関数です。

2. デコレータの構文

デコレータの構文は次のとおりです:

@decorator
def foo():
    pass
ログイン後にコピー

このうち、decorator はデコレータ関数 ## です。 #foo は通常の関数です。 @decorator 構文を使用すると、Python インタープリターは自動的に foo 関数を decorator 関数に渡し、decorator 関数を返します。値は foo 関数に割り当てられるため、foo 関数を呼び出すことで変更された関数を呼び出すことができます。

3. デコレータのアプリケーション シナリオ

デコレータのアプリケーション シナリオは非常に幅広く、次の側面が含まれますが、これらに限定されません:

    ロギング
デバッグと分析を改善するために、デコレーターを通じて関数の実行ログを記録できます。

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)
ログイン後にコピー

4. 共通のデコレータ パターン

デコレータ パターンは、次の要素を含む共通のデザイン パターンです:

    抽象コンポーネント クラスは、次のインターフェイスを定義します。飾られたオブジェ。
  1. 具象コンポーネント クラスは、抽象コンポーネント クラスによって定義されたインターフェイスを実装します。
  2. デコレータ オブジェクトのインターフェイスを定義する抽象デコレータ クラス。
  3. 具体的なデコレータ クラスは、抽象的なデコレータ クラスによって定義されたインターフェイスを実装します。
Python では、通常、関数を使用してデコレータ パターン内のクラスとオブジェクトをシミュレートします。以下に簡単な例を示します。

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 は抽象デコレータ クラス、 ConcreteDecoratorAConcreteDecoratorB は具体的なデコレータ クラスです。

5. 概要

この記事の説明を通じて、Python のデコレーターが関数の機能を拡張し、コードの再利用を実現するのに役立つ非常に強力な機能であることがわかります。コードの柔軟性と読みやすさが向上します。デコレータを合理的に適用すると、プログラムをより簡潔、エレガント、そして効率的にすることができます。

以上がPython のデコレータを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート