前言
装饰器:为函数添加附属功能,本质为函数
原则:不修改被修饰函数的源代码
不修改被修饰函数的调用方式
装饰器=高阶函数+函数嵌套+闭包
使用场景演示
定义下面函数
def cal(l):
res = 0
for i in l:
time.sleep(0.1)
res+=1return res
想要实现检测函数的运行时间
import time
def cal(l):
start_time = time.time()
res = 0
for i in l:
time.sleep(0.1)
res+=1
stop_time = time.time()
print("函数的运行时间%s" %(stop_time-start_time))
return res
以上函数虽然完美的实现了测量时间,但是违反了开放封闭原则,修改了函数中的代码,我们应该在不改变函数代码的前提下加入检测时间的功能,由此应该引入装饰器的概念
import time
def timer(func):
def wrappper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs) # --> (不修改修饰函数的源代码)
stop_time=time.time()
print('函数运行的时间%s' %(stop_time-start_time))
return res
return wrappper
注:其上就是装饰器
@timer #做了将cal函数名作为参数传给了timer函数,并返回赋值给cal cal = timer(cal) --> (不修改修饰函数的调用方式)
def cal(l):
res = 0
for i in l:
time.sleep(0.1)
res+=1
return res
cal(range(10))#这里的cal,调用的其实是装饰器里的wrapper内嵌函数