标签:
# 多层装饰器 USER_INFO = {} # 使用一个全局的字典,存储一些状态 def check_login(func): """ 检查登陆装饰器 :param func: :return: """ def inner(*args,**kwargs): if USER_INFO.get(‘is_login‘): # 判断USER_INFO键对应值是否为真,为真状态已登录 ret = func(*args,**kwargs) return ret else: print(‘请登录...‘) return inner def check_admin(func): """ 检查是否为管理员 :param func: :return: """ def inner(*args,**kwargs): if USER_INFO.get(‘user_type‘) == 2: # 判断USER_INFO键对应值是否为2,是2位管理员 ret = func(*args,**kwargs) return ret else: print(‘无权限查看‘) return inner @check_login def home(): print(‘home‘) def login(): user = input("请输入用户名") if user == ‘admin‘: USER_INFO[‘is_login‘] = True USER_INFO[‘user_type‘] = 2 else: USER_INFO[‘is_login‘] = True USER_INFO[‘user_type‘] = 1 @check_login @check_admin def index(): print(‘Index‘) if __name__ == ‘__main__‘: while True: inp = input("1.登录;2.查看;3.管理员") if inp == ‘1‘: login() elif inp == ‘2‘: home() elif inp == ‘3‘: index() # 程序简要说明: # 1. 使用check_login装饰器判断是否已登录 # 2. 使用check_admin装饰器判断是否为管理员 # 3. 主要介绍装饰器功能,所以主函数简单点,当用户输入“1”为登陆,登陆后可“查看”,登陆用户为admin可使用“管理员”
# 然后我们在上一节已经了解到装饰器概念:被装饰器装饰的函数,在运行时会以参数的方式将函数整体传入到装饰器函数中,并将装饰器函数中的内层函数重新赋值给被装饰的函数 # 所以,在这里同样的适用,这里我们拿被装饰了两层装饰器的函数index,以上代码我们依次传入装饰器,将会这样执行 # 1. 首先,函数会被传入离它“最近”的check_admin装饰器,index将会变成这样: @check_login def index(): if USER_INFO.get(‘user_type‘) == 2: print("Index") return None else: print(‘无权限查看‘) # 注意: # 第一,这里我的index并没有参数,所以你要这样拆分理解解释器时,函数有参数一定要传入参数 # 第二,index本身函数也简单,并没有return值,但是在函数中,没有任何返回,返回的就是None # 2. 然后,函数再此被以参数的方式传入到check_login装饰器,index将会变成这样 def index(): if USER_INFO.get(‘is_login‘): if USER_INFO.get(‘user_type‘) == 2: #-+ print("Index") # | return None # |---这里部分就是上一步的内容 else: # | print(‘无权限查看‘) # -+ return None else: print(‘请登录...‘) # 或者,这里嵌套的有点繁琐,那我们就把第一步比作“1” def index(): if USER_INFO.get(‘is_login‘): 1 return None else: print(‘请登录...‘) # 这样的多层函数就会理解得更清晰
标签:
原文地址:http://www.cnblogs.com/coolking/p/5568564.html