装饰器
装饰器:定义一个函数,为其他函数添加额外功能
def index(x,y,z):
print(x,y,z)
def outter(func):
def wrapper(*args,**kwargs):
import time
start = time.time()
res = func(*args,**kwargs)
end = time.time()
return res
return wrapper
index = outter(index)
index(1,2,3)
开放封闭原则:拓展功能开放,修改源码封闭
语法糖:@timmer
def auth(func):
def wrapper(*args,**kwargs):
# 1、调用原函数
# 2、为其增加新功能
name=input('your name>>: ').strip()
pwd=input('your password>>: ').strip()
if name == 'egon' and pwd == '123':
res=func(*args,**kwargs)
return res
else:
print('账号密码错误')
return wrapper
@auth
def index():
print('from index')
index()
@func
把下面的函数名传入@后面的函数名加括号的里面的参数,然后将返回值赋值给下面的函数名
wrapper.__name__ = func.__name__
wrapper.__doc__ = func.__doc__
from functools import wraps
在wrapper定义上再加装饰器
@wraps(func)
wapper改了参数,那index调用的时候也得变,那就不符合要求了
有参装饰器:
from functools import wraps
def auth(x1,y1,z1):
def outter(func):
@wraps(func)
def wrapper(*args,**kwargs):
import time
start = time.time()
res = func(*args,**kwargs)
end = time.time()
print(x1,y1,z1)
return res
return wrapper
return outter
@auth(0,0,0)
def index(x,y,z):
print(x,y,z)
index(1,2,3)
print(index.__name__)
装饰器调用:
加载顺序:自下而上
最终index就是最外层的wrapper
执行顺序:从外层到内层