Python 复杂的装饰器

  • Post category:Python

Python 装饰器(Decorator)是 Python 编程中一个常用的技术,它是用于修改代码行为的一种方式。装饰器的核心理念是将函数作为参数,并返回该函数的函数,这样可以在函数或类的执行前或执行后动态地添加功能或修改其行为方式。复杂的装饰器可以在一些高级的场景中使用,比如性能分析、重试、权限校验等。下面是 Python 复杂的装饰器使用方法的完整攻略:

1. 装饰带参数的函数

有时候,我们需要在装饰器中给函数传递参数,来满足一些特定的需求,比如定时调度任务,就需要把时间作为参数传递到装饰器中。下面是一个带参数的装饰器示例:

import time

def timer(func):  
    def wrapper(*args, **kwargs):
        start_time = time.time()
        func(*args, **kwargs)
        end_time = time.time()
        print('运行时间:', end_time - start_time)
    return wrapper

@timer
def func_with_param(num):
    print('开始执行')
    time.sleep(num)

func_with_param(2)

在这个示例中,timer 装饰器是带有参数的,需要一个函数作为参数,用于计算函数运行的时间。在 wrapper 函数中,*args**kwargs 可以接收任意参数和关键字参数,然后计算函数运行的时间,最后输出结果。在 @timer 的装饰下,func_with_param 函数就变成了一个新的函数,可以记录函数运行的时间。

2. 被装饰函数带有返回值

有时候,被装饰的函数会有返回值,我们需要让装饰器也能够正确处理返回值。下面是一个带返回值的装饰器示例:

def my_decorator(func):
    def wrapper():
        print("Before function")
        result = func()
        print("After function")
        return result
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

message = say_hello()
print(message)

在这个示例中,被装饰的函数 say_hello 会输出 “Hello!”,然后返回 Nonemy_decorator 装饰器中的 wrapper 函数会输出 “Before function”,然后执行 func 函数,并拿到返回值 result,最后输出 “After function”,并返回 result。在 @my_decorator 的装饰下,say_hello 函数就能够返回正确的结果。

通过以上两个示例,我们可以了解到 Python 复杂的装饰器的使用方法,可以帮助我们更好地处理一些复杂的场景和需求。