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

一、多层装饰器

需求如下:

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

#!/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()

双层装饰器执行图解:

时间: 2024-11-13 10:31:48

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

day_5装饰器、字符串格式化、序列化、内置模块、生成器、迭代器之篇】

一.装饰器 为什么要用装饰器??? 在实际的开发环境中应遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但也适用于函数式编程,简单地说,它规定已经实现的功能代码不是允许修改的,但是可以被扩展: 封闭:已实现的功能代码块 开发:对扩展开发 装饰器功能: 1)自动执行装饰器下面的函数,并将被装饰器函数的函数名当做参数传递给装饰器函数 2)装饰器函数的返回值,重新赋值给被装饰函数 #装饰器格式:@+函数名 #装饰器格式:@+函数名 def outer(func): def inner(arg):

Day5 双层装饰器、字符串格式化

双层装饰器实现用户登录和权限认证 #!/usr/bin/env python# -*- coding: utf-8 -*-# Author: WangHuafeng USER_INFO = {} def check_login(func): def inner(*args, **kwargs): #.get拿数据时,不存在则默认为None if USER_INFO.get('is_login', None): ret = func(*args, **kwargs) return ret else

python装饰器详解,多层装饰器,及带参数的装饰器。

pyhon学习有一段时间了,今天又碰到了Django的中间件,其实Django里面的中间件,就是用了多层的装饰器,然后去了解了一下多层装饰器,感觉有写东西差不多快忘了,也可能前面没学好. 现在重新记录,学习下. 普通装饰器: def warp(func): print('我是装饰器,碰到需要装饰的函数,一开始执行这里') def inner(*args, **kwargs): print('这里才是真正的装饰开始!') res = func(*args, **kwargs) print('装饰结

python的装饰器

装饰器 函数即对象 在python的里,函数和我们之前的[1,2,3],'abc',8等一样都是对象,而且函数是最高级的对象(对象是类的实例化,可以调用相应的方法,函数是包含变量对象的对象). 1 def foo(): 2 print('i am the foo') 3 bar() 4 5 def bar(): 6 print('i am the bar') 7 8 foo() 9 # def bar(): #报错 10 # print('i am the bar') 带着这个问题,我们聊一聊函

Python之装饰器、迭代器和生成器

在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思来谁就是对特定的建筑物内按照一定的思路和风格进行美化的一种行为,所谓“器”就是工具,对于python来说装饰器就是能够在不修改原始的代码情况下给其添加新的功能,比如一款软件上线之后,我们需要在不修改源代码和不修改被调用的方式的情况下还能为期添加新的功能,在python种就可以用装饰器来实现,同样在写

Python 函数装饰器入门

原文链接: --> A guide to Python's function decorators Python功能强劲,语法表现力强,尤其装饰器深深的吸引着我.在设计模式中,装饰器可以在不使用子类的情况下,动态的改变函数,方法以及类的功能.这个功能非常有用,特别在你想扩展函数的功能同时又不想改变原有的函数.的确,我们任意的实现装饰器设计模式,但是,python通过提供简单的语法和特性让装饰器的实现变的如此简单. 在本文中,我将用一组例子来深入浅入python 函数装饰器的功能,所有的例子都是在

〖Python〗-- 装饰器

[装饰器] 函数即对象 在python的世界里,函数和我们之前的[1,2,3],'abc',8等一样都是对象,而且函数是最高级的对象(对象是类的实例化,可以调用相应的方法,函数是包含变量对象的对象). def foo(): print('i am the foo') bar() def bar(): print('i am the bar') foo() # def bar(): #报错 # print('i am the bar') 函数在内存的存储情况:  图1 函数对象的调用仅仅比其它对象

如何用python的装饰器定义一个像C++一样的强类型函数

Python作为一个动态的脚本语言,其函数在定义时是不需要指出参数的类型,也不需要指出函数是否有返回值.本文将介绍如何使用python的装饰器来定义一个像C++那样的强类型函数.接下去,先介绍python3中关于函数的定义. 0. python3中的函数定义 举个例子来说吧,比如如下的函数定义: 1 def fun(a:int, b=1, *c, d, e=2, **f) -> str: 2 pass 这里主要是说几点与python2中不同的点. 1)分号后面表示参数的annotation,这个

说说Python的装饰器模式与面向切面编程

说说Python的装饰器模式与面向切面编程 今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 1. 装饰器入门 1.1. 需求是怎么来的? 装饰器的定义很是抽象,我们来看一个小例子. //edit http://www.lai18.com //date 2