登录认证装饰器(有参装饰器)

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
'''