码迷,mamicode.com
首页 > 编程语言 > 详细

python装饰器(二)

时间:2016-06-07 23:50:21      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

函数附加多个装饰器

# 多层装饰器
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(请登录...)


# 这样的多层函数就会理解得更清晰

 

python装饰器(二)

标签:

原文地址:http://www.cnblogs.com/coolking/p/5568564.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!