装饰器
1,什么是装饰器
装饰器是一个用来被装饰者添加功能的工具
被装饰者:函数
装饰器:可以用函数实现装饰器这种工具
2,为什么要用装饰器
为了在不修改被装饰器对象源代码以及调用方式的前提下为被装饰对象添加上新功能
无参装饰器:
相当于叠加两层的闭包函数
import time
def index(x):
print('welcome to index page %s ' % x )
time.sleep(3)
#方案一:修改了源代码
import time
def index(x):
start = time.time()
print('welcome to index page %s ' % x )
time.sleep(3)
stop = time.time()
print(stop-start)
index(111)
#方案二:没有修改被装饰对象的源代码以及调用方式,但有代码冗余
import time
def index(x):
print('welcome to index page %s ' % x )
time.sleep(3)
start = time.time()
index(111)
stop = time.time()
print(stop-start)
# 方案三:wrapper函数需要外部传入参数
import time
def index(x):
print('welcome to index page %s ' % x)
time.sleep(3)
def wrapper(func):
start = time.time()
func(111)
stop = time.time()
print(stop - start)
wrapper(index)
# 方案五:
import time
def index(x):
print('welcome to index page %s ' % x )
time.sleep(3)
return 666
def otuuer(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
stop = time.time()
print(stop-start)
return res
return wrapper
index = outter(index)
res = index(111)
print(res)
# 方案六:把wrapper伪装的跟被装饰对象一样,更进一步
import time
def index(x):
print('welcome to index page %s ' % x )
time.sleep(3)
return 666
def otuuer(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
stop = time.time()
print(stop-start)
return res
wrapper.__doc__ = index.__doc__
wrapper.__name__ = index.__name__
return wrapper
index = outter(index)
res = index(111)
print(res)
无参装饰器模板:
def outter(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wparrer
有参装饰器:
相当于叠加三层的闭包函数
结论:最多三层
def outter(x):#这里还可以加参数
def deco(func):
def wrapper(*args,**kwargs):
print(x)
res = func(*args,**kwargs)
return res
return wrapper
return deco
@outter(111)
def index():
pass
import time
from functools import wraps
def outter(func):
@wraps(func)
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
stop = time.time()
print(stop-start)
return res
wrapper.__doc__ = index.__doc__
wrapper.__name__ = index.__name__
return wrapper
@outter
def index(x):
print('welcome to index page %s ' % x )
time.sleep(3)
return 666
叠加多个装饰器
加载顺序于执行顺序
def index():
print('from index')
def deco1(func1):
def wrapper1(*args,**kwargs):
print('运行wrapper1')
res1 = func1(*args.**kwargs)
return res1
return wrapper1
def deco1(func2):
def wrapper2(*args,**kwargs):
print('运行wrapper1')
res2 = func2(*args.**kwargs)
return res2
return wrapper2
def deco3(func1):
def wrapper3(*args,**kwargs):
print('运行wrapper1')
res3 = func3(*args.**kwargs)
return res3
return wrapper3
@deco1
@deco2
@deco3
def index():
print('from index')
从上往下运行,结束是从下往上
浙公网安备 33010602011771号