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

day05 Python多层装饰器、模块、字符串格式化、生成器和迭代器、递归

时间:2016-06-12 13:51:15      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

一、多层装饰器

需求如下:

    程序运行时需判断当前是否有用户登录,以及当前登录的用户名是否为管理员账户,但有的函数只需判断当前是否有用户登录就可以,有的函数两个都需要判断,所以将这两个判断分开写成两个装饰器,在需要判断时直接使用相应的一个或两个装饰器即可,具体代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-


#保存当前登录的账户名及账户类型(管理员为2,普通用户为1)
USER_INFO = {}

def check_login(func):
    """
    判断当前是否有用户登录的装饰器
    :param func:
    :return:
    """
    def inner(*args, **kwargs):
        if USER_INFO.get(is_login, None):
            ret = func(*args, **kwargs)
            return ret
        else:
            return (请登录)
    return inner

def check_admin(func):
    """
    装饰器:用来判断当前所登录用户的类型是普通账户还是管理员账户
    :param func:
    :return:
    """
    def inner(*args, **kwargs):
        if USER_INFO.get(user_type, None) == 2:
            ret = func(*args, **kwargs)
            return ret
        else:
            return (无权限查看)
    return inner

def login():
    """
    登录函数
    :return:
    """
    username = input("请输入用户名: ")
    password = input("请输入密码:")
    if username == ordinary and password == 123:
        USER_INFO[is_login] = True
        USER_INFO[user_type] = 1
        return ("欢迎访问")
    elif username == admin and password == 456:
        USER_INFO[is_login] = True
        USER_INFO[user_type] = 2
        return ("欢迎管理员登录")
    else:
        return "用户名或密码错误"

@check_login
@check_admin
def index_admin():
    """
    管理员的功能
    管理员的功能需要判断当前是否有用户登录,以及当前登录的用户是否为管理员账户,所以这里要用到两个装饰器
    :return:
    """
    return (管理员的功能)

@check_login
def index_ordinary():
    """
    普通账户的功能
    :return:
    """
    return "普通用户的功能"

def run():
    """
    前端
    :return:
    """
    dict_choice = {1:login,2:index_admin,3:index_ordinary}
    while True:
        print("1: 登录\n2: 管理员功能\n3: 普通用户功能")
        user_choice = input("请输入项目编号(输入‘q‘结束程序):")
        if user_choice in dict_choice.keys():
            res = dict_choice[user_choice]()
            print(res)
        elif user_choice == q:
            break
        else:
            print("你的输入有误,请重新输入")

if __name__ == __main__:
    run()

双层装饰器执行图解:

技术分享

day05 Python多层装饰器、模块、字符串格式化、生成器和迭代器、递归

标签:

原文地址:http://www.cnblogs.com/xuanouba/p/5577109.html

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