函数附加多个装饰器
# 多层装饰器
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('请登录...')
# 这样的多层函数就会理解得更清晰