双层装饰器
还是老样,没有改变:
USER_INFO = {} def check_login(func): def inner(*args, **kwargs): if USER_INFO.get("is_login", None): # 用get方法拿字典里面的内容,如果字典里面没有我们要拿的参数,不会报错,给他默认返回的为None ret = func(*args, **kwargs) return ret else: print("请登录") return inner def check_admin(func): # 判断是否为管理员用户 def inner(*args, **kwargs): if USER_INFO.get("is_login", None): if USER_INFO.get("user_type", None) == 2: # 如果用户类型等于2,表示为管理员用户 ret = func(*args, **kwargs) return ret else: print("无权限查看") # 否者无权限查看 else: print("请登录") return inner @check_admin def index(): # 超级管理员可以查看 print("index") @check_login def home(): # 登录可以查看 """ 普通用户的功能 :return: """ print("home") def login(): # 登录 user = input("请输入用户名:") if user == "admin": USER_INFO["is_login"] = True USER_INFO["user_type"] = 2 else: # 否者如果不为admin,表示登录的用户为普通用户 USER_INFO["is_login"] = True USER_INFO["is_login"] = 1 def main(): while True: inp = input("1、登录;2、查看信息;3超级管理员\n>>>") if inp == "1": login() elif inp == "2": home() elif inp == "3": index() main()
输出:
1、登录;2、查看信息;3超级管理员 >>>2 请登录 1、登录;2、查看信息;3超级管理员 >>>3 请登录 1、登录;2、查看信息;3超级管理员 >>>1 请输入用户名:user 1、登录;2、查看信息;3超级管理员 >>>2 home 1、登录;2、查看信息;3超级管理员 >>>3 无权限查看 1、登录;2、查看信息;3超级管理员 >>>1 请输入用户名:admin 1、登录;2、查看信息;3超级管理员 >>>2 home 1、登录;2、查看信息;3超级管理员 >>>3 index 1、登录;2、查看信息;3超级管理员 >>>
新变化:
# 从版本以一中我们可以看到很多我们的check_admin里面重复了check_login的代码(check_admin又判断登录,又判断权限), # 如果我们又加上了超级管理员,那我们就会又写一个重复的装饰器, # 所以我们需要用到双层装饰器,先用check_login,判断是否登录,然后用check_admin判断是否为管理员 USER_INFO = {} def check_login(func): def inner(*args, **kwargs): if USER_INFO.get("is_login", None): # 用get方法拿字典里面的内容,如果字典里面没有我们要拿的参数,不会报错,给他默认返回的为None ret = func(*args, **kwargs) return ret else: print("请登录") return inner def check_admin(func): # 判断是否为管理员用户 def inner(*args, **kwargs): if USER_INFO.get("user_type", None) == 2: # 如果用户类型等于2,表示为管理员用户 ret = func(*args, **kwargs) return ret else: print("无权限查看") # 否者无权限查看 return inner # 为什么check_login写上面,我们从下向上看,从index()开始, # 可以看到先用admin装饰后,比如变成了nindex这个函数,然后再用login装饰进行装饰,比如又变成了nnindex,然后python是从上向下执行, # 所以python会执行nnindex,判断是否登录,然后在执行nindex,判断是否为管理员,如果没有登录, # 提示登录,如果已经登录(不为管理员),提示无权限 @check_login @check_admin def index(): # 管理员可以查看 """ 管理员的功能 :return: """ print("index") @check_login def home(): # 登录可以查看 """ 普通用户的功能 :return: """ print("home") def login(): # 登录 user = input("请输入用户名:") if user == "admin": USER_INFO["is_login"] = True USER_INFO["user_type"] = 2 else: # 否者如果不为admin,表示登录的用户为普通用户 USER_INFO["is_login"] = True USER_INFO["is_login"] = 1 def main(): while True: inp = input("1、登录;2、查看信息;3超级管理员\n>>>") if inp == "1": login() elif inp == "2": home() elif inp == "3": index() main()
输出:
1、登录;2、查看信息;3超级管理员 >>>2 请登录 1、登录;2、查看信息;3超级管理员 >>>3 请登录 1、登录;2、查看信息;3超级管理员 >>>1 请输入用户名:user 1、登录;2、查看信息;3超级管理员 >>>2 home 1、登录;2、查看信息;3超级管理员 >>>3 无权限查看 1、登录;2、查看信息;3超级管理员 >>>1 请输入用户名:admin 1、登录;2、查看信息;3超级管理员 >>>2 home 1、登录;2、查看信息;3超级管理员 >>>3 index 1、登录;2、查看信息;3超级管理员 >>>
输出效果完全一样,注意看v2的注释
装饰器的原理(多层原理也一样):