装饰器在编写后台的逻辑时有可能会用到,比方说一个场景:公司的员工想要登录自己公司的考勤记录系统去修改自己的考勤,以前是随便谁都有权限去修改,这样老板不同意了,现在,要在你登录前加一个权限验证的逻辑,如果你权限没有达到等级要求,你就不能登录系统去修改自己的考勤记录。如何在不改动原函数的情况下去增加这部分权限验证的功能呢?这就用到的装饰器函数。
装饰器函数的一大有点就是,在不改动原函数的基础上,去给函数增加新的功能。
装饰器有两种,一种是没有参数的,一种是有参数的,本示例两种装饰器都有,不过只运行了有参数的。
有关用法和解释在代码中已经注释。下面是一个例子。
# 装饰器函数的两个特点,也是必须满足的条件 # 1. 闭包 # 2. 外部函数的返回值必须是内部函数 # 这是一个没有参数的装饰器的例子 def decorator(func): def wrapper(): print('在登录前,先检查有没有此账号。') # !@#$%^&*,在数据库中查询 # 如果数据库的已注册表中查到此用户,就执行登录函数 login()。 # 如果没有查到,则显示“请先注册,然后登录” func() return wrapper # 上面已经写好了一个装饰器,下面是用法 @decorator def login1(): # 比方说这里是一段很复杂的逻辑,现在用登录操作代替 print('我现在要登录了') # 这是一个有参数的装饰器例子 def decorator2(func): def wrapper2(name): # 数字越小,权限越高 priLevelDict = {'赵总': 1, '赵总': 2, '小王': 3} # 判断字典中是否存在某个key,可以用 in 或者 not in来判断 # print('小王' in priLevelDict) if name in priLevelDict: print('正在对{}进行权限验证'.format(name)) # 如果权限验证通过,则可以进行下一步的登录,管理 # 如果权限验证不通过,则不能登录。逻辑自己设计就好 # print(priLevelDict[name]) if priLevelDict[name] == 1 or priLevelDict[name] == 2: print('验证通过') func(name) elif priLevelDict[name] == 3: print('对不起,{},您没有权限登录,请有点自知之明。'.format(name)) print() else: print('你tm是谁啊,数据库里都找不到你,滚犊子。') return wrapper2 @decorator2 def login2(name): print('尊敬的{}, 现在您可以登录管理系统进行管理'.format(name)) print() if __name__ == '__main__': while 1: name = input('请输入你的姓名:') login2(name)
运行结果:
请输入你的姓名:赵总 正在对赵总进行权限验证 验证通过 尊敬的赵总, 现在您可以登录管理系统进行管理 # 这可是领导,老板要查岗,必须得通过啊 请输入你的姓名:钱经理 正在对钱经理进行权限验证 验证通过 尊敬的钱经理, 现在您可以登录管理系统进行管理 # 这是顶头上司,也要好好巴结一下 请输入你的姓名:小王 正在对小王进行权限验证 对不起,小王,您没有权限登录,请有点自知之明。 # 这是同事,说话比较随意 请输入你的姓名:老李 你tm是谁啊,数据库里都找不到你,滚犊子。 # 这不是我们公司员工 ,不用客气 请输入你的姓名: