装饰器:
定义:本质是函数,(装饰其他函数)就为其他函数添加附加功能
原则:1.不能修改被修饰的函数源代码
2.不能修改被修饰的函数的调用方式
实现装饰器知识储备:
1.函数即‘变量’
2.高阶函数
3.嵌套函数
高阶函数+嵌套函数=》装饰器
import time
def _time(func):
star_time = time.time()
time.sleep(3)
return func
end_time=time.time()
print(star_time-end_time)
def t():
print(1)
t=_time(t)
t()
分析:这么写 return 后代码无法执行 只满足了装饰器的高阶函数的条件,改造一下如下
import time def desc(func): def timer(*args,*kwargs): star_time =time.time() func(*args,*kwargs) end_time=time.time() print(end_time-star_time) return timer @desc#te=desc(te) def te(): time.sleep(1) print(1)
#第一层装饰器传参数 def auth(auth_type): print("auth func:",auth_type) #第二层 传入方法的地址 def outerwrapper(func): #第三层传入方法带参数 def wrapper(*args,**kwargs): print(1) #判断传入的值 if auth_type=='local': username=input('username:').strip() password=input('pwd').strip() if username=='1' and password=='2': #接受返回的方法 res=func(*args,**kwargs) print('--after authenticaion') return res else: exit("\033[31;1mInvalid username or password\033[0m") elif auth_type=='ldap': print("python 这个代码反人类") #将最后一层的指向倒数第二层 return wrapper #倒数第二层的指向最后一层 return outerwrapper @auth(auth_type="local")#auth=outerwrapper(auth) 因为返回的是函数outerwrapper的地址 def index(): print('welcome') @auth(auth_type="ldap") def bbs(): print("welcome to bbs page") index() bbs()