登录认证装饰器(有参装饰器)
def auth(role): #auth可以有任意多个参数
from core import admin, stu, teacher
def login_auth(func): #由于语法糖的限制,login_auth的参数只能是被装饰对象的名称
def wrapper(*args, **kwargs): #由于参数的限制,wrapper的参数只能是被装饰对象的参数
if role == 'admin':
if admin.admin_info['user']:
res = func(*args, **kwargs)
return res
else:
admin.login()
elif role == 'stu':
if stu.stu_info['user']:
res = func(*args, **kwargs)
return res
else:
stu.login()
elif role == 'teacher':
if teacher.teacher_info['user']:
res = func(*args, **kwargs)
return res
else:
teacher.login()
else:
print('你选择的功能不存在')
return wrapper
return login_auth
无参装饰器模板
import time
from functools import wraps
def timer(func): #func为被装饰对象的内存地址
@wraps(func) #wraps也是一个装饰器,实现的功能是:将func的各个属性值赋值给wrapper的对应属性,使得在查看wrapper的属性时,显示出来的是func.属性名称,而不是wrapper.属性名称,
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)
time.sleep(1)
stop = time.time()
print(stop-start)
return res
return wrapper
@timer #此例中,@timer相当于index=timer(index) 将函数index的内存地址传入,并将装饰器timer的返回值即函数wrapper的内存地址返回并赋值给变量index
def index(x,y,z):
'''原始index'''
print(x,y,z)
return x
print(index) # 即函数wrapper的内存地址
a=index(5,z=3,y=2)#这个调用index函数是在调用wrapper函数
print('返回值',a)
print(index.__name__)
print(index.__doc__)
'''
5 2 3
1.0
返回值 5
index
原始index
'''
'''
注释掉:@wraps(func)的结果如下
5 2 3
1.0
返回值 5
wrapper
None
'''