11:装饰器
装饰器的形成:
加入要计算执行代码的时间,执行下面程序:
import time def timemer(): def inner(): start=time.time() time.sleep(0.01) print('老师同学新年好!') end=time.time() print(end-start) return inner
其中:
time.sleep(0.01) print('老师同学新年好!')
这句代码可以用新的函数代替:
def func(): time.sleep(0.01) print('老师同学新年好!')
那么,当func=timmer(func)时,timmer变成这样:
def timemer(f): #装饰器函数 def inner(): start=time.time() f() end=time.time() print(start-end) return inner
此时func就是被装饰的函数
装饰器的作用:
不想修改函数的调用方式,但是还想在原来的函数前后添加功能,timmer就是一个装饰器函数,只是对一个函数有一些装饰作用。
原则:开放封闭原则
开放:对扩展是开放的
封闭:对修改是封闭的
装饰器:装饰带参数的函数
装饰带参数函数的装饰器 def timmer(f): #装饰器函数 def inner(*args,**kwargs): #(1,2) /(1) start = time.time() ret = f(*args,**kwargs) #f(1,2) #被装饰的函数 end = time.time() print(end - start) return ret return inner @timmer #语法糖 @装饰器函数名 def func(a,b): #被装饰的函数 time.sleep(0.01) print('老板好同事好大家好',a,b) return '新年好' @timmer #语法糖 @装饰器函数名 def func1(a): #被装饰的函数 time.sleep(0.01) print('老板好同事好大家好',a) return '新年好' func = timmer(func) ret = func(1,2) #inner() ret = func(1,b = 2) #inner() print(ret)
def wrapper(f): #装饰器函数,f是被装饰的函数 def inner(*args,**kwargs): '''在被装饰函数之前要做的事''' ret = f(*args,**kwargs) #被装饰的函数 '''在被装饰函数之后要做的事''' return ret return inner @wrapper #语法糖 @装饰器函数名 def func(a,b): #被装饰的函数 time.sleep(0.01) print('老板好同事好大家好',a,b) return '新年好