装饰器出现的原因是因为我们应对新的需求:在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能;它的本质是闭包函数。
装饰器的结构:
def timmer(func): def inner(*args,**kwargs): ‘‘‘添加函数调用之前的扩展代码‘‘‘ ret = func(*args,**kwargs) ‘‘‘添加函数调用之后的扩展代码‘‘‘ return ret return inner
两个def 两个return互相对应。
装饰器的设计模式:是开放封闭原则;既对扩展是开放的,对修改是封闭的。
计算一个函数的运行的时间:
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)()
这个函数可以计算有限的代码运行时间,面对企业大规模的应用这种方法就不可行啦。需要用下面的方法:
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 @timmer#语法糖必须紧跟着定义的函数 def hahaha(): time.sleep(0.1) print(‘aaaa‘) # hahaha() #timmer(hahaha)() #我们不能修改这个函数的调用方式 #也不能修改原代码 #hahaha = timmer(hahaha) #timmer函数的地址给了hahaha hahaha() #实际上执行的是timmer
如果被装饰的函数有参数传入呢:
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 def jjj(): return 123 jjj = timmer(jjj) print(jjj()) #==>inner
时间: 2024-10-14 07:01:48