现在又有问题来了,我们调装饰器的时候,每调一次,又要把装饰器对象传进来,调一次又传一次,这样不会觉得很麻烦吗?那么我们又想到了一种方法,就是装饰器语法糖,在被装饰对象的上面加@timmer 用它来取代 index=timmer(index)
并且把返回值正常的返回给它。
import time
def timmer(func): #func为最原始的home
def warpper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs) #调用了最原始的home
stop_time=time.time()
print(stop_time-start_time)
return res
return warpper
@timmer #就是取代底下的 index=timmer(index)
def index():
time.sleep(2)
print('hello word,Linux公社')
@timmer #就是取代底下的home=timmer(home) home(name='yuan')
def home(name):
time.sleep(6)
print('welcome %s to home page'%name)
index()
home('linuxidc.com')
//输出:
hello word,Linux公社
2.001802682876587
welcome linuxidc.com to home page
6.005476951599121
注意:这里的timmer函数就是最原始的装饰器,它的参数就是一个函数,然后返回值也是一个函数。其中作为参数的这个函数index()和hemo(name)就是在返回函数的wrapper()的内部执行。然后再这两个函数的前面加上@timmer,index()和home(name)函数就相当于被注入了计时功能,现在只需要调用index()和home(‘yuan’),它就已经变身为‘新功能更多的函数了。’
所以这里的装饰器就像一个注入的符号:有了它,拓展了原来函数的功能既不需要侵入函数内更改代码,也不需要重复执行原函数。
用装饰器来实现认证功能:
import time
current_user={
'username':None,
#'login_time':None
}
def auth(func):
# func = index
def wrapper(*args,**kwargs):
if current_user['username']:
print('已经登录过了')
res=func(*args,**kwargs)
return res
uname = input('输入用户名:').strip()
pwd = input('密码:').strip()
if uname == 'linuxmi' and pwd == '123':
print('登录成功')
current_user['username']=uname
res = func(*args,**kwargs)
return res
else:
print('用户名或密码错误')
return wrapper
@auth #index = auth(index)
def index():
time.sleep(1)
print('welcom to index page')
@auth
def home(name):
time.sleep(2)
print('welcome %s to home page'%name)
input()
home('linuxmi')
有参数的装饰器来用于用户认证
import time
current_user={
'username':None,
# 'login_time':None
}
def auth(func):
# func=index
def wrapper(*args,**kwargs):
if current_user['username']:
print('已经登陆过了')
res=func(*args,**kwargs)
return res
uname=input('用户名>>: ').strip()
pwd=input('密码>>: ').strip()
if uname == 'linuxmi' and pwd == '123':
print('登陆成功')
current_user['username']=uname
res=func(*args,**kwargs)
return res
else:
print('用户名或密码错误')
return wrapper