flask(1)装饰器
1,普通的装饰器
装饰器的本质就是闭包,在不改变原来函数的基础上,拓展一个新功能。
闭包的特点:可以延长局部变量的生命周期
def outer(func):
def inner(*args,**kwargs):
res = func(*args,**kwargs)
return res
return inner
@outer()
def func():
pass
func()
""" @ 功能
1,先把装饰器修饰的函数当成参数传递给装饰器
2,将新函数返回,去替换旧函数, func = inner
"""
2,带参数的装饰器
def outer(name):
def wapper(func):
def inner1(*args, **kwargs):
res = func(*args, **kwargs)
print("我是xxxx")
return res
def inner2(*args, **kwargs):
res = func(*args, **kwargs)
print("我是oooo")
return res
if name == "alex":
return inner1
else:
return inner2
return wapper
@outer("alex")
def func():
print("how aer you ?")
func()
3,functools.wraps
在装饰器中使用,保留原来函数的属性
def wrapper(func):
def inner(*args, **kwargs):
res = func(*args, **kwargs)
return res
return inner
def func():
pass
func()
print(func) # <function wrapper.<locals>.inner at 0x00A40BF8>
def wrapper(func):
@wraps(func)
def inner(*args, **kwargs):
res = func(*args, **kwargs)
return res
return inner
@wrapper
def func():
pass
func()
print(func) # <function func at 0x00480BF8>
4,伪类装饰器[Flask before_request]
func_list = []
def outer(func):
func_list.append(func)
@outer
def b1():
pass
@outer
def b2():
pass
print(len(func_list)) # 2
5,一个函数上应用多个装饰器
就近分析
@xxx
@oooo
@xxoo
def index(a1,a2):
return a1 + a2
from functools import wraps
def xxx(func):
print(3)
@wraps(func)
def inner(*args, **kwargs):
res = func(*args, **kwargs)
return res
return inner
def oooo(func):
print(2)
@wraps(func)
def inner(*args, **kwargs):
res = func(*args, **kwargs)
return res
return inner
def xxoo(func):
print(1)
@wraps(func)
def inner(*args, **kwargs):
res = func(*args, **kwargs)
return res
return inner
@xxx
@oooo
@xxoo
def index(a1, a2):
return a1 + a2
浙公网安备 33010602011771号