# 模板defoutter(func):defwrapper(*args,**kwargs):
res=func(*args,**kwargs)return res
return wrapper
# @outter# ---被装饰对象代码---# 简单计时器无参装饰器import time
deftimer(func):defwrapper(*args,**kwargs):
start_time = time.time()
res = func(*args,**kwargs)
stop_time = time.time()print('run time is %s'%(stop_time - start_time))return res
return wrapper
@timer # index=timer(index)defindex():
time.sleep(3)print('Welcome to the index page')return200
index()#Welcome to the index page#run time is 3.004727840423584# 叠加多个无参装饰器
@deco3
@deco2
@deco1
defindex():pass# 语义如下
index=deco3(deco2(deco1(index)))
3.2有参装饰器
# 有参装饰器模板defoutter2(x):defoutter(func):defwrapper(*args,**kwargs):
res = func(*args,**kwargs)return res
return wrapper
return outter
# @outter2(111)# ---被装饰对象代码---# 举例:为被装饰对象添加认证功能的装饰器import time
deflogin(x, engine='file'):defauth(func):defwrapper(*args,**kwargs):print("=====>", x)
inp_user =input("username>>>: ").strip()
inp_pwd =input("password>>>: ").strip()if engine =="file":print("基于file的认证")if inp_user =="arthur"and inp_pwd =="123":print('login successful')
res = func(*args,**kwargs)return res
else:print('username or password error')elif engine =="mysql":print("基于mysql的认证")elif engine =="ldap":print('基于ldap的认证')else:print("认证来源未知")return wrapper
return auth
@login(11, engine='file')# @auth index=auth(index) index=wrapperdefindex():
time.sleep(1)print('from index')
@login(22, engine='mysql')# @auth home=auth(home) home=wrapperdefhome(name):
time.sleep(2)print('home page,welcome %s'% name)return123
index()
home("arthur")# functools模块下提供一个装饰器wraps,可以保留原函数的文档和函数名属性import time
from functools import wraps
deftimmer(func):
@wraps(func)defwrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
stop = time.time()print('run time is:%s'%(stop - start))return res
# wrapper.__name__=func.__name__# wrapper.__doc__=func.__doc__return wrapper
@timmer # index= timmer(index) # index=wrapperdefindex():"""index函数"""
time.sleep(1)print('from index')print(index)print(index.__name__)help(index)
# 输出结果:
<function index at 0x7fafc61079d0>
index
Help on function index in module __main__:
index()
index函数