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中非常强大的工具之一。
