import time
def log_execution_time(func):
def wrapper(*args, **kwargs):
print(f"开始执行函数 {func.__name__}")
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_execution_time
def test_function():
time.sleep(2)
print("这是被装饰的函数")
if __name__ == "__main__":
test_function()
装饰器工作原理解释:
- 定义装饰器函数:
log_execution_time
是一个装饰器函数,它接受一个函数 func
作为参数。
- 定义内部包装函数:在
log_execution_time
内部定义了 wrapper
函数,这个函数接受任意位置参数 *args
和关键字参数 **kwargs
。这样 wrapper
函数可以接受与被装饰函数相同的参数。
- 日志打印与时间记录:
- 在调用被装饰函数
func
之前,打印开始执行的日志信息。
- 使用
time.time()
获取当前时间作为函数执行开始时间 start_time
。
- 调用被装饰函数
func
,并将其返回值保存到 result
中。
- 再次使用
time.time()
获取当前时间作为函数执行结束时间 end_time
,计算并打印函数执行耗时。
- 返回包装函数:
log_execution_time
函数最后返回 wrapper
函数。这样,当使用 @log_execution_time
装饰其他函数时,实际上是将被装饰函数替换为 wrapper
函数,从而在执行被装饰函数的前后添加了日志记录和时间计算的功能。