加载装饰器就是将原函数名偷梁换柱成了装饰器最外层那个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('psaaword:').strip() if engine == 'file': print('基于文件的认证') if name =='egon' and pwd =='123': print('successfull') res=func(*args,**kwargs) return res elif engine == 'mysql' print('基于mysql的认证') elif engine == 'ldap' print('基于ldap的认证') else: print('错误的认证源') return wrapper2 return xxx @timmer#index=timmer(wrapper2的内存地址)#index=wrapper1的内存地址 @auth(engine='file') #@xxx#index=xxx(最原始那个index的内存地址)#index=wrapper2的内存地址 def index(): print('welcome to index page') time.sleep(2) index()#wrapper1的内存地址() '''