ホームページ > バックエンド開発 > Python チュートリアル > Python でデコレータを効果的に使用してチェーンする方法は?

Python でデコレータを効果的に使用してチェーンする方法は?

Linda Hamilton
リリース: 2025-01-01 08:10:10
オリジナル
540 人が閲覧しました

How to Effectively Use and Chain Decorators in Python?

Python でデコレータを作成およびチェーンする方法

デコレータの作成

という別の関数を受け取るデコレータ関数を作成します。 「ラップされた」関数として、引数:

def my_decorator(func):

    # Code to execute before calling the wrapped function
    print("Before the function runs")

    # Call the wrapped function and store its return value
    result = func()

    # Code to execute after calling the wrapped function
    print("After the function runs")

    # Return the result of the wrapped function
    return result

# Example of a decorator in action
@my_decorator
def say_hello():
    print("Hello, world!")
ログイン後にコピー

デコレータの連鎖

同じ関数に複数のデコレータを適用するには @ 演算子を使用します:

@my_decorator
@another_decorator
def chained_function():
    print("This function is doubly decorated")
ログイン後にコピー

引数を持つデコレータ

デコレータに次のことを許可します。引数を受け入れる:

def decorator_with_arg(arg1, arg2):

    def decorator(func):

        # Use the decorator arguments to modify the wrapped function's behavior
        func.arg1 = arg1
        func.arg2 = arg2

        return func

# Example of a decorator with arguments
@decorator_with_arg("foo", "bar")
def my_function():
    print("Args:", my_function.arg1, my_function.arg2)
ログイン後にコピー

クラス メソッドのデコレータ

クラス内のメソッドにデコレータを使用する:

class MyClass:

    @classmethod
    def my_class_method(cls):
        print("This is a class method")
ログイン後にコピー

練習:デコレータの装飾

デコレータを作成するこれにより、他のデコレータが引数を受け入れるようになります:

def decorator_with_args(decorator_to_enhance):

    def decorator_maker(*args, **kwargs):

        def decorator_wrapper(func):

            # Wrap the original decorator and pass the arguments
            return decorator_to_enhance(func, *args, **kwargs)

        return decorator_wrapper


# Example of a decorated decorator
@decorator_with_args
def decorated_decorator(func, *args, **kwargs):
    print("Args:", args, kwargs)
    return func


@decorated_decorator(10, 20, name="John")
def my_function():
    print("Decorated function")
ログイン後にコピー

ベスト プラクティス

  • デコレータのオーバーヘッドによるコードの速度低下を回避します。
  • を使用します。 functools.wraps() を使用して元の関数を保存します。
  • デコレータは、関数に適用されると永続的になります。
  • デバッグに使用するか、外部ライブラリから既存の機能を拡張することを検討してください。

使用例

タスクにデコレータを使用する例:

  • 関数の実行時間の測定 (@benchmark)
  • 関数呼び出しのログ記録 (@logging)
  • 関数呼び出しのカウント (@counter)
  • 関数の結果をキャッシュする

以上がPython でデコレータを効果的に使用してチェーンする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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