装饰器
1.装饰器是在不改变原函数的执行的情况下为原函数增额外的功能。
简单版装饰器
import time def func1(): print('执行速度') def timmer(f): start_time=time.time() f() time.sleep(0.3) end_time=time.time() print('此函数的执行效率%s'% (end_time-start_time)) f1=func1 func1=timmer func1(f1)
import time def timmer1(f): #f接收的是@timmer下面原函数的函数名func1 def inner(): f() start_time=time.time() time.sleep(0.3) end_time=time.time() print('此函数的执行效率%s' % (end_time - start_time)) return inner @timmer1 def func1(): print('测试速度') func1() 执行结果: 测试速度 此函数的执行效率0.30037736892700195
2.被装饰函数带参数的装饰器
# import time # def timmer(f):#f=func1=inner # def inner(*args,**kwargs): # start_time=time.time() # f(*args,**kwargs) #func1((*args,**kwargs)) # time.sleep(0.3) # end_time=time.time() # print('此函数的执行效率%s'% (end_time-start_time)) # return inner # @timmer # def func1(a,b,c,d): #timmer(func1) # print(a,b,c,d) # print('测试效率') # func1(1,2,3,4)
3.装饰器模版
def wrapper(func): def inner(*args,**kwargs): ret=func(*args,**kwargs) return ret return inner @wrapper def func(a,b): print(666) func(1,2,3)
4.带参数的装饰器
import time def timmer(*args,**kwargs): def wrapper(f): def inner(*args,**kwargs): if flag: start_time=time.time() ret=f(*args,**kwargs) time.sleep(0.3) end_time=time.time() print('此函数的执行效率%f' %(end_time-start_time)) else: ret=f(*args,**kwargs) return ret return inner return wrapper flag=True #flag=False 关掉装饰器 @timmer(flag) # 两步:1.把timmer(flag)当成一个普通话函数传给def timmer(),返回wrapper 2.变成@wrapper装饰器 def func1(): print(666) func1() 执行结果: 666 此函数的执行效率0.300240
5.多个装饰器
def wrapper1(func):# func=f=inner1 def inner1(): print('wrapper1,before func') #2 func() print('wrapper1,after func') #3 return inner1 def wrapper2(func): # func=inner1=inner2 def inner2(): print('wrapper2,before func') #1 func() print('wrapper2,after func') #4 return inner2 @wrapper2 # f = wrapper2(f) 里面的f==inner1 外面的f == inner2 @wrapper1 # f = wrapper1(f) 里面的f==函数名f 外面的f == inner1 def f():# f=inner1 print('in f') f() #f=inner1=inner2 执行结果: wrapper2,before func wrapper1,before func in f wrapper1,after func wrapper2,after func