装饰器
一、装饰器的形成过程
最简单的装饰器------->有返回值--------->有一个参数---------->万能参数
最简单的装饰器
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()
七、多个装饰器装饰一个函数

注意:哪个装饰器离函数近,先执行哪个装饰器
来源:https://www.cnblogs.com/gaoya666/p/8137336.html
