首頁 > 後端開發 > Python教學 > 如何在Python中有效使用和連結裝飾器?

如何在Python中有效使用和連結裝飾器?

Linda Hamilton
發布: 2025-01-01 08:10:10
原創
508 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板