一、含义
装饰器:本质上就是就是一个返回函数的高阶函数,其作用是为其他函数添加附加的功能,在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。 装饰器 = 高阶函数+函数嵌套+闭包
二、原则
1、不修改被修饰函数的源代码。 2、不修改被修饰函数的调用方式。
三、实现方式
假如,现在我们要得到运行一个函数所花费的时间,我们应该如何设计程序呢?如果是一个函数,那么我们可以直接在函数执行前后获取当前时间,再相减,就得出运行时间。
import time
def calculate(l):
start_time = time.time()
res = 0
for i in l:
time.sleep(0.1)
res += i
end_time = time.time()
print("运行时间为%.2f秒" % (end_time-start_time))
return res
print(calculate(range(20)))
输出结果:
运行时间为2.17秒
190
那么,如果现在我们要同时给多个函数,统计函数的执行时间。那么显然一个一个去加入代码,改变源代码的方式,是不可取的。 那么,这个时候,我们就可以利用装饰器来实现了。
整体实现如下: (1)文件一:
import time
from day13_装饰器.装饰器_获取函数执行时间 import timer
@timer
def calculate(l):
res = 0
for i in l:
time.sleep(0.1)
res += i
return res
res = calculate(range(20))
print(res)
装饰器,我写在单独的一个文件里。 (2)文件二:
import time
import functools
def timer(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
res = func(*args, **kwargs)
end_time = time.time()
print("函数%s运行时间为%.2f 秒" % (func.__name__, end_time-start_time))
return res
return wrapper
最后,执行文件一,执行结果如下:
函数calculate运行时间为2.18 秒
190
|