欢迎访问宙启技术站
智能推送

Python装饰器(Decorator)的详细解释和实例使用

发布时间:2023-07-02 07:28:32

Python装饰器是一种用于修改函数或类的功能的语法特性。装饰器本质上是一个函数,接受一个函数作为输入,并返回一个新的函数作为输出。装饰器函数通常在被装饰的函数之前或之后执行一些额外的操作,然后将结果返回。

装饰器的特点是可以在不影响原函数代码的情况下,为其添加额外的功能,比如日志记录、性能统计、参数验证等。装饰器提供了一种灵活且可重用的方式来扩展和修改函数的行为。

以下是一个简单的装饰器的示例,用于记录函数的执行时间:

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        execution_time = end_time - start_time
        print(f"函数 {func.__name__} 的执行时间为 {execution_time} 秒")
        return result
    return wrapper

@timer
def my_function():
    time.sleep(2)

my_function()

在上面的示例中,timer 是一个装饰器函数,它接收一个函数作为参数,并返回一个新的函数 wrapperwrapper 函数在被装饰的函数 my_function 前后执行额外的操作,计算函数执行的时间,并将结果打印出来。我们使用@timer语法将装饰器应用于 my_function,相当于执行了 my_function = timer(my_function)

执行以上代码,会输出如下的结果:

函数 my_function 的执行时间为 2.0017905235290527 秒

可以看到,装饰器函数成功地添加了额外的功能,而原函数的代码保持不变。

装饰器还可以带有参数,下面是一个接收参数的装饰器示例:

def repeat_n_times(n):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(n):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat_n_times(3)
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")

在上面的示例中,repeat_n_times 是一个接收参数的装饰器函数,它返回一个新的装饰器函数 decoratordecorator 函数在被装饰的函数 greet 前后执行额外的操作,即重复执行 greet 函数 n 次。我们使用 @repeat_n_times(3) 将装饰器应用于 greet 函数,相当于执行了 greet = repeat_n_times(3)(greet)

执行以上代码,会输出如下的结果:

Hello, Alice!
Hello, Alice!
Hello, Alice!

可以看到,装饰器函数成功地重复执行了被装饰的函数 greet