一、多层装饰器
需求如下:
程序运行时需判断当前是否有用户登录,以及当前登录的用户名是否为管理员账户,但有的函数只需判断当前是否有用户登录就可以,有的函数两个都需要判断,所以将这两个判断分开写成两个装饰器,在需要判断时直接使用相应的一个或两个装饰器即可,具体代码如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- #保存当前登录的账户名及账户类型(管理员为2,普通用户为1) USER_INFO = {} def check_login(func): """ 判断当前是否有用户登录的装饰器 :param func: :return: """ def inner(*args, **kwargs): if USER_INFO.get(‘is_login‘, None): ret = func(*args, **kwargs) return ret else: return (‘请登录‘) return inner def check_admin(func): """ 装饰器:用来判断当前所登录用户的类型是普通账户还是管理员账户 :param func: :return: """ def inner(*args, **kwargs): if USER_INFO.get(‘user_type‘, None) == 2: ret = func(*args, **kwargs) return ret else: return (‘无权限查看‘) return inner def login(): """ 登录函数 :return: """ username = input("请输入用户名: ") password = input("请输入密码:") if username == ‘ordinary‘ and password == ‘123‘: USER_INFO[‘is_login‘] = True USER_INFO[‘user_type‘] = 1 return ("欢迎访问") elif username == ‘admin‘ and password == ‘456‘: USER_INFO[‘is_login‘] = True USER_INFO[‘user_type‘] = 2 return ("欢迎管理员登录") else: return "用户名或密码错误" @check_login @check_admin def index_admin(): """ 管理员的功能 管理员的功能需要判断当前是否有用户登录,以及当前登录的用户是否为管理员账户,所以这里要用到两个装饰器 :return: """ return (‘管理员的功能‘) @check_login def index_ordinary(): """ 普通账户的功能 :return: """ return "普通用户的功能" def run(): """ 前端 :return: """ dict_choice = {‘1‘:login,‘2‘:index_admin,‘3‘:index_ordinary} while True: print("1: 登录\n2: 管理员功能\n3: 普通用户功能") user_choice = input("请输入项目编号(输入‘q‘结束程序):") if user_choice in dict_choice.keys(): res = dict_choice[user_choice]() print(res) elif user_choice == ‘q‘: break else: print("你的输入有误,请重新输入") if __name__ == ‘__main__‘: run()
双层装饰器执行图解:
时间: 2024-11-13 10:31:48