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()