装饰器
import time def timmer(func): #函数名可以当做函数的参数 def inner(): start = time.time() func() end = time.time() print(end - start) return inner def hahaha(): time.sleep(0.1) print('aaaa') #hahaha() # timmer(hahaha) #我们不能修改这个函数的调用方式 #也不能修改原代码 # hahaha = timmer(hahaha) #timmer函数的地址给了hahaha # hahaha() #实际上执行的是timmer import time def timmer(func): #函数名可以当做函数的参数 def inner(): start = time.time() func() end = time.time() print(end - start) return inner def hahaha(): time.sleep(0.1) print('aaaa') # hahaha = timmer(hahaha) #timmer函数的地址给了hahaha # hahaha() # def timmer(func): #---> hahaha # def inner(x,y): # func(x,y) # --->hahaha # return inner # # def hahaha(a,b): # time.sleep(0.1) # print(a,b) # # hahaha = timmer(hahaha) # #我们不能修改这个函数的调用方式 # hahaha(1,2) #==>inner(1,2) def timmer(func): #---> hahaha def inner(x,y): func(x,y) # --->hahaha return inner def hahaha(a,b): time.sleep(0.1) print(a,b) def kkk(a): print(a) # hahaha = timmer(hahaha) # hahaha(1,2) #inner(1,2) def timmer(func): #---> hahaha def inner(*args,**kwargs): #args == (1,2) kwargs == {} #*args == 1,2 **kwargs == a =1,b = 2 func(*args,**kwargs) # --->hahaha return inner def kkk(a): print(a) kkk = timmer(kkk) # kkk(1) def timmer(func): #---> jjj def inner(*args,**kwargs): ret = func(*args,**kwargs) # --->ret = jjj() return ret return inner @timmer #jjj = timmer(jjj) 语法糖 def jjj(): return 123 # jjj = timmer(jjj) ret = jjj() #==>inner #装饰器的本质 :闭包函数 #功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能 def timmer(func): def inner(*args,**kwargs): '''添加函数调用之前的扩展代码''' ret = func(*args,**kwargs) '''添加函数调用之后的扩展代码''' return ret return inner #设计模式 原则 开放封闭原则 #对扩展是开放的 #对修改是封闭的 def wrapper(func):#装饰 def inner(*args,**kwargs): ret = func(*args,**kwargs) return ret return inner @wrapper def aaa(): print('asghksdlhf') @wrapper def bbb(): print('asghksdlhf') # aaa() # bbb() # aaa() # bbb() import time def wrapper(func): # 装饰 def inner(*args, **kwargs): start = time.time() ret = func(*args, **kwargs) end = time.time() print(end - start) return ret return inner @wrapper def lll(): time.sleep(0.1) print('hello') lll()
一、带参数的装饰器;------开关
__author__ = 'Administrator' F=True def outer(F): def wap(fun):#gg def inner(*args,**kwargs): if F: print("inner before") ret=fun(*args,**kwargs)#gg() print("inner after") else: ret=fun(*args,**kwargs) return ret return inner return wap @outer(F) #先执行out(F) ----@wap----->gg=wap(gg) def gg(): print("gg............") gg()#inner()
二、多个装饰器装饰一个函数
__author__ = 'Administrator' def yn(fun):#fun=sc_inner def yn_inner(*args,**kwargs): print("yun..........before") ret=fun(*args,**kwargs)#sc_inner() print("yn...........after") return ret return yn_inner def sx(fun):#fun=china def sx_inner(*args,**kwargs): print("sx..........before") ret=fun(*args,**kwargs)#china() print("sx...........after") return ret return sx_inner @yn #china=yn(china)-----china=yn(sx(china))----china=yn(sx_inner)---->china=yn_ineer @sx #china=sx(china)----china= def china(): print("china is good ") china()#yn_inner()
三、装饰器的一个应用
l = [] def wrapper(func): l.append(func) #统计当前程序中有多少个函数被装饰了 def inner(*args,**kwargs): #l.append(func) #统计本次程序执行有多少个带这个装饰器的函数被调用了 ret = func(*args,**kwargs) return ret return inner @wrapper #f1 = wrapper(f1) def f1(): print('in f1') @wrapper #f2 = wrapper(f2) def f2(): print('in f2') @wrapper #f2 = wrapper(f2) def f3(): print('in f3') print(l)