加载装饰器就是将原函数名偷梁换柱成了装饰器最内层哪个wrapper函数
在加载完毕后,在调用原函数其实就是在调用wrapper函数
当一个被装饰的对象同时叠加多个装饰器时,
装饰器的加载顺序是,自下从上
装饰器内wrapper函数的执行顺序是,自上而下。
import time def timmer(func): #func=wrapper2的内存地址 def wrapper1(*args, **kwargs): print('===================================>wrapper1运行了') start=time.time() res = func(*args, **kwargs) #===========================>跳到wrapper2去执行了, stop=time.time() print('run time is %s' %(stop - start)) return res return wrapper1 def auth(engine='file'): def xxx(func): # func=最原始那个index的内存地址 def wrapper2(*args, **kwargs): print('===================================>wrapper2运行了') name=input('username>>>: ').strip() pwd=input('password>>>: ').strip() if engine == 'file': print('基于文件的认证') if name == 'egon' and pwd == '123': print('login successfull') res = func(*args, **kwargs) return res elif engine == 'mysql': print('基于mysql的认证') elif engine == 'ldap': print('基于ldap的认证') else: print('错误的认证源') return wrapper2 return xxx @auth(engine='file') @timmer def index(): print('welcome to index page') time.sleep(2) index()