装饰器
一、装饰器的形成过程
最简单的装饰器------->有返回值--------->有一个参数---------->万能参数
最简单的装饰器
import time def func(): time.sleep(1) print("大家好") def timmer(f): #装饰器函数 def inner(): start=time.time() f() #被装饰的函数 end=time.time() print(end-start) return inner func=timmer(func) #相当于inner() func
有返回值
import time def timmer(f): #装饰器函数 def inner(): start = time.time() ret = f() #被装饰的函数 end = time.time() print(end - start) return ret return inner @timmer #语法糖 @装饰器函数名 def func(): #被装饰的函数 time.sleep(0.01) print('老板好同事好大家好') return '新年好' # func = timmer(func) ret = func() #inner() print(ret)
装饰带参数函数的装饰器
import time 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 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)
二、装饰器的作用
1、不想修改函数的调用方式,但是还想在原来的函数前后添加功能。
2、timmer就是一个装饰器函数,但是对一个函数有一些装饰作用。
三、原则:开放封闭原则
开放:对扩展是开放的
封闭:对修改是封闭的
四、装饰器的固定模式
def wrapper(func): #qqxing def inner(*args,**kwargs): ret = func(*args,**kwargs) #被装饰的函数 return ret return inner @wrapper #qqxing = wrapper(qqxing) def qqxing(): print(123) ret = qqxing() #inner
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 '新年好' def wrapper(): def inner(): pass return inner
五、wraps
from functools import wraps #导入wraps装饰器 def wrapper(func): #func = holiday @wraps(func) def inner(*args,**kwargs): print('在被装饰的函数执行之前做的事') ret = func(*args,**kwargs) print('在被装饰的函数执行之后做的事') return ret return inner @wrapper #holiday = wrapper(holiday) def holiday(day): '''这是一个放假通知''' print('全体放假%s天'%day) return '好开心' print(holiday.__name__) #查看字符串格式的函数名 print(holiday.__doc__) #document ret = holiday(3) #inner print(ret)
六、带参数的装饰器
import time FLAGE = False #定义全局变量 def timmer_out(flag): def timmer(func): def inner(*args,**kwargs): if flag: start = time.time() ret = func(*args,**kwargs) end = time.time() print(end-start) return ret else: ret = func(*args, **kwargs) return ret return inner return timmer # timmer = timmer_out(FLAGE) @timmer_out(FLAGE) #wahaha = timmer(wahaha) def wahaha(): time.sleep(0.1) print('wahahahahahaha') @timmer_out(FLAGE) def erguotou(): time.sleep(0.1) print('erguotoutoutou') wahaha() erguotou()
七、多个装饰器装饰一个函数
注意:哪个装饰器离函数近,先执行哪个装饰器