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

Python装饰器的概念和用法详解

发布时间:2023-12-03 16:20:07

Python装饰器是一种用于增加和修改函数或类的功能的语法结构,它可以在不修改被修饰对象源代码的情况下,动态地修改对象的行为。

装饰器本质上是一个函数,该函数接受一个函数作为参数,并返回一个新的函数。这样我们可以使用装饰器来包装一个函数,使得被包装的函数在执行前后可以额外执行一些代码。

装饰器的用法:

1. 使用 @ 符号将装饰器应用到函数或类上。例如:

@decorator
def function_name():
    pass
    
@decorator_with_args(arg1, arg2)
def function_name():
    pass
    
@decorator_class
class ClassName:
    pass

2. 在函数或类定义之前,使用 @ 后面跟着装饰器名称的方式将装饰器应用到该函数或类。

下面是一个示例,以更好地说明装饰器的概念和用法。假设我们有一个名为 log_time 的装饰器,用于记录函数的执行时间,并在函数执行前后打印执行时间。

import time

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

@log_time
def my_function(a, b):
    time.sleep(2)  # 模拟函数执行耗时
    return a + b
    
result = my_function(3, 4)
print(result)

输出结果为:

函数 my_function 的执行时间为: 2.000572443008422 秒
7

在上述代码中,我们定义了一个 log_time 装饰器函数,并将其应用到 my_function 函数上。装饰器函数接收一个函数作为参数,并返回一个新的函数。这个新的函数 wrapper 是原始函数 my_function 的包装函数,在执行原始函数之前和之后执行额外的代码。

在包装函数 wrapper 的内部,我们使用 time 模块来记录函数执行的开始时间和结束时间。然后,我们执行原始函数,并计算执行时间。最后,我们打印函数执行时间并返回函数的结果。

通过应用装饰器 @log_time,我们可以在不修改原始函数 my_function 源代码的情况下,为其添加了额外的功能。每次调用 my_function,都会自动记录函数的执行时间并打印。

Python装饰器的概念和用法在实际编码中非常常见,可以帮助我们实现函数的统一日志记录、异常处理、权限验证等功能。而且由于装饰器是函数,所以可以自由组合使用。这种灵活性使得装饰器成为Python中非常强大的工具之一。