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

python的学习之路day5

时间:2017-12-23 18:59:13      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:image   user   不为   turn   输入   python   rgs   play   pos   

双层装饰器

还是老样,没有改变:

技术分享图片
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()
v1

输出:

技术分享图片
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超级管理员
>>>
v1的输出

 

新变化:

技术分享图片
# 从版本以一中我们可以看到很多我们的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()
v2

输出:

技术分享图片
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的输出

输出效果完全一样,注意看v2的注释

 

装饰器的原理(多层原理也一样):

技术分享图片

 

python的学习之路day5

标签:image   user   不为   turn   输入   python   rgs   play   pos   

原文地址:http://www.cnblogs.com/smelond/p/8093822.html

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