import time
def timer(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
@timer
def test_function():
time.sleep(2)
print("函数执行中...")
test_function()
装饰器工作原理解释
- 定义装饰器函数:
timer
是一个装饰器函数,它接受一个函数 func
作为参数。
- 定义内部包装函数:在
timer
函数内部定义了 wrapper
函数。这个函数接受任意位置参数 *args
和关键字参数 **kwargs
,这使得它可以适配任何参数形式的被装饰函数。
- 记录开始时间:在调用被装饰函数
func
之前,使用 time.time()
记录当前时间,作为函数执行的开始时间 start_time
。
- 调用被装饰函数:执行
func(*args, **kwargs)
调用被装饰的函数,并将结果保存到 result
中。
- 记录结束时间:在被装饰函数执行完毕后,再次使用
time.time()
记录时间,作为函数执行的结束时间 end_time
。
- 打印执行时间:计算并打印被装饰函数的执行时间
end_time - start_time
。
- 返回结果:返回被装饰函数的执行结果
result
,这样被装饰函数的原有功能不会受到影响。
- 应用装饰器:使用
@timer
语法糖将 timer
装饰器应用到 test_function
函数上,这等价于 test_function = timer(test_function)
。当调用 test_function
时,实际上调用的是 wrapper
函数,从而实现了在执行函数前后记录时间并打印的功能。