1.什么是装饰器
装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,
增加额外的功能,装饰器的返回值也是一个函数对象。
装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景
2.装饰器的形成过程
import time
def func1():
print('in func1')
def timer(func):
def inner():
start = time.time()
func()
print(time.time() - start)
return inner
func1 = timer(func1)
func1()
但是如果有多个函数,我都想让你测试他们的执行时间,你每次是不是都得func1 = timer(func1)?这样
还是有点麻烦,因为这些函数的函数名可能是不相同,有func1,func2,graph,等等,所以更简单的方
法,python给你提供了,那就是语法糖。
#装饰器-语法糖
import time def timer(func): def inner(): start = time.time() func() print(time.time() - start) return inner @timer #==> func1 = timer(func1) def func1(): print('in func1') func1()
装饰器-带参数的语法糖
def timer(func):
def inner(a):
start = time.time()
func(a)
print(time.time() - start)
return inner
@timer
def func1(a):
print(a)
func1(1)
能hole住所有参数的装饰器
import time
def timmerout(flag1): # flag1 =flag
def timmer(f):
def inner(*args,**kwargs):
if flag1:
start_time = time.time()
ret = f(*args,**kwargs)
end_time = time.time()
print('此函数的执行效率%s' % (end_time - start_time))
return ret
else:
ret = f(*args, **kwargs)
return ret
return inner
return timmer
flag = False
@timmerout('alex','nan',1000) # 1,将@ 与函数分开@ timmerout(flag) 返回了timmer 2,将@timmer结合。
def func1():
time.sleep(0.3)
print('非常复杂......')
return 666
@timmerout(flag)
def func2():
time.sleep(0.3)
print('非常复杂......')
return 666
@timmerout(flag)
def func3():
time.sleep(0.1)
print('非常复杂......')
return 666
1,将@ 与函数分开@ timmerout(flag) 返回了timmer
2,将@timmer结合
def timmerout(flag1): # flag1 =flag
def timmer(f):
def inner(*args,**kwargs):
if flag1:
start_time = time.time()
ret = f(*args,**kwargs)
end_time = time.time()
print('此函数的执行效率%s' % (end_time - start_time))
return ret
else:
ret = f(*args, **kwargs)
return ret
return inner
return timmer
@timmerout('京东') # 1,将@ 与函数分开@ timmerout(flag) 返回了timmer 2,将@timmer结合。
def JDshop():
time.sleep(0.3)
print('非常复杂......')
return 666
@timmerout('京东')
def JD():
time.sleep(0.3)
print('非常复杂......')
return 666
@timmerout('淘宝')
def taobao():
time.sleep(0.1)
print('非常复杂......')
return 666
@timmerout('淘宝')
def taobaoshop():
time.sleep(0.1)
print('非常复杂......')
return 666
func1()
func2()
func3()