一、理论知识:

定义:装饰器本身是函数,就是为了为其他函数添加附加功能。

原则:

1、不能修改被修饰函数的源代码

2、不能修改被修饰函数的调用方式

装饰器知识必备:

1、函数即“变量”

2、高阶函数

a:把一个函数名作为实参传给另外一个函数

b:返回值中包含函数值

3、嵌套函数

高阶函数+嵌套函数=》装饰器


二、低潮版

importtimedeftimmer(func):defbar(*args,**kwargs):#*args,**kwargs:表示非固定参数start_time=time.time()func(*args,**kwargs)stop_time=time.time()print('thefuncruntime%s'%(stop_time-start_time))returnbar#只是返回了内存地址,并没有运行bar()函数@timmer#调用装饰器timmer。相当于:test1=timmer(test1)deftest1():#由于返回bar()的地址,所以test1=timmer(test1)=bartime.sleep(3)print('inthetest1')@timmerdeftest2(name):print('inthetest2',name)#test1=timmer(test1)#把返回的bar()函数内存地址赋值给test1test1()test2(2)

三、高潮版

当被修饰函数中出现返回值(return 'from home')

user,passwd='peter','123qwe'defauth(auth_type):print('auth_type:',auth_type)defouter(func):defwarpper(*args,**kwargs):print('warpper:',*args,**kwargs)username=input('Username:').strip()password=input('Password:').strip()if(user==usernameandpasswd==password):print('\033[32;1mUserhaspassedauthentication\033[0m')te=func(*args,**kwargs)#相当于执行home(*args,**kwargs)print('----------')returnteelse:exit('\033[31;1mInvalidusernameorpassword\033[0m')returnwarpperreturnouterdefindex():print('welcometoindexpage')@auth(auth_type='local')defhome(name):print('welcometohomepage',name)return'fromhome'@auth(auth_type='lodap')defbbs():print('welcometobbspage')index()print(home(2))bbs()