【Python自动化运维之路Day5】基础篇

今日目录:

多层装饰器

字符串格式化

生成器和迭代器

递归

模块

一. 多层装饰器

还是上一篇的那个例子,关于用户管理程序:登录用户管理程序,查看用户信息的时候,系统要提示登录,登录验证成功后普通用户可以查看自己信息,管理员登录后才可以进入管理界面,普通用户提示权限不足,这样一来,就可以重新写下程序,来两个装饰器来装饰;

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Author: DBQ(Du Baoqiang)

#先定义一个用户字典,判断用户状态,用户身份等
USER_INFO = {‘user_state‘: False, ‘admin_flag‘:2}

#搞一个装饰器,装饰管理后台,检查用户身份等
def outer(func):
    def inner(*args,**kwargs):
        if USER_INFO[‘user_state‘]:
            result = func(*args,**kwargs)
            return result
        else:
            print(‘你没有登陆系统,请登陆后再操作!‘)
    return inner

#在定义一个check_manager装饰器,用户检测用户登录身份是管理员还是普通用户
def check_manager(func):
    def inner(*args, **kwargs):
        if USER_INFO[‘admin_flag‘] == 0:
            result = func(*args,**kwargs)
            return result
        else:
            print(‘权限不足!‘)
    return inner

#管理后台函数被装饰的时候,从下到上渲染,解释执行的时候是从上到下执行,所以先使用outer装饰, 再使用check_manager
@outer
@check_manager
def manager():
    print(‘欢迎登陆到管理员界面‘)

#检查用户身份函数
@outer
def checkuser(username):
    if USER_INFO[‘admin_flag‘] == 0:
        print(‘{} 您的用户是管理员身份‘.format(username))
    else:
        print(‘{} 普通用户啦‘.format(username))

#登录函数
def login(username,userpwd):
    if username == ‘tom‘ and userpwd == ‘123‘:
        USER_INFO[‘user_state‘] = True
        USER_INFO[‘current_user‘] = username
        USER_INFO[‘admin_flag‘] = 0
        manager()
    elif username == ‘jerry‘ and userpwd == ‘123‘:
        USER_INFO[‘user_state‘] = True
        USER_INFO[‘current_user‘] = username
        USER_INFO[‘admin_flag‘] = 1
    else:
        print(‘用户名或者密码错误!‘)
        #print(‘欢迎登陆 %s‘ %username)

#主函数
def main():
    while True:
        print(‘1: 管理后台   2: 登陆   3. 检查用户身份  4. 退出‘)
        user_input_num = input(‘选择下吧:‘).strip()
        if user_input_num == ‘1‘:
            result = manager()
        elif user_input_num == ‘2‘:
            username = input(‘请输入您的用户名:‘).strip()
            userpwd = input(‘密码‘).strip()
            login(username,userpwd)
        elif user_input_num == ‘3‘:
            checkuser(USER_INFO.get(‘current_user‘,None))
        elif user_input_num == ‘4‘:
            print(‘Bye‘)
            break

if __name__ == ‘__main__‘:
    main()

使用两个装饰器装饰一个函数

使用一个多层装饰器来装饰同一个用户身份、权限等;

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Author: DBQ(Du Baoqiang)

#先定义一个用户字典,判断用户状态,用户身份等
USER_INFO = {‘user_state‘: False, ‘admin_flag‘:2}

#搞一个装饰器,装饰管理后台,检查用户身份等
def outer(func):
    def inner(*args,**kwargs):
        if USER_INFO[‘user_state‘]:
            if USER_INFO[‘admin_flag‘] == 0:
                result = func(*args,**kwargs)
                return result
            else:
                print(‘权限不足!‘)
        else:
            print(‘你没有登陆系统,请登陆后再操作!‘)
    return inner

# 在定义一个check_manager装饰器,用户检测用户登录身份是管理员还是普通用户
# def check_manager(func):
#     def inner(*args, **kwargs):
#         if USER_INFO[‘admin_flag‘] == 0:
#             result = func(*args,**kwargs)
#             return result
#         else:
#             print(‘权限不足!‘)
#     return inner

#只使用一个装饰器装饰
@outer
def manager():
    print(‘欢迎登陆到管理员界面‘)

#检查用户身份函数
@outer
def checkuser(username):
    if USER_INFO[‘admin_flag‘] == 0:
        print(‘{} 您的用户是管理员身份‘.format(username))
    else:
        print(‘{} 普通用户啦‘.format(username))

#登录函数
def login(username,userpwd):
    if username == ‘tom‘ and userpwd == ‘123‘:
        USER_INFO[‘user_state‘] = True
        USER_INFO[‘current_user‘] = username
        USER_INFO[‘admin_flag‘] = 0
        manager()
    elif username == ‘jerry‘ and userpwd == ‘123‘:
        USER_INFO[‘user_state‘] = True
        USER_INFO[‘current_user‘] = username
        USER_INFO[‘admin_flag‘] = 1
    else:
        print(‘用户名或者密码错误!‘)
        #print(‘欢迎登陆 %s‘ %username)

#主函数
def main():
    while True:
        print(‘1: 管理后台   2: 登陆   3. 检查用户身份  4. 退出‘)
        user_input_num = input(‘选择下吧:‘).strip()
        if user_input_num == ‘1‘:
            result = manager()
        elif user_input_num == ‘2‘:
            username = input(‘请输入您的用户名:‘).strip()
            userpwd = input(‘密码‘).strip()
            login(username,userpwd)
        elif user_input_num == ‘3‘:
            checkuser(USER_INFO.get(‘current_user‘,None))
        elif user_input_num == ‘4‘:
            print(‘Bye‘)
            break

if __name__ == ‘__main__‘:
    main()

使用多层装饰器

时间: 2024-08-08 08:03:07

【Python自动化运维之路Day5】基础篇的相关文章

python自动化运维之路~DAY7

python自动化运维之路~DAY7 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.客户端/服务器架构 C/S 架构是一种典型的两层架构,其全称是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据:另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信. C/S 架构也可以看做是胖客户端架构.因为客户端需要实现绝大多数的业务

python自动化运维之路~DAY10

python自动化运维之路~DAY10 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

【Python自动化运维之路Day7】基础篇

今日目录: 模块 configparser xml shutil zipfile tarfile subprocess 面向对象(上) 一. 模块 上一期博客里列出了几个常用模块(os,hashlib,sys,re), 还有几个剩余的,这篇来继续往下走. 1. configparser模块 configparser模块是Python自带模块,主要用于处理特定的文件(ini文件),格式比较像MySQL的配置文件类型,就是文件中有多个section,每个section下面有多个配置项,如下: [my

《Python自动化运维之路》 系统基础信息模块(一)

系统性能收集模块Psutil 目录: 系统性能信息模块psutil 系统性能信息模块psutil psutil能够轻松实现获取系统运行的进程和系统利用率包括(CPU,内存,磁盘 和网络)等.主要用于系统监控.对于系统维护来说是个不错的模块. 1.模块的安装 wget https://files.pythonhosted.org/packages/14/a2/8ac7dda36eac03950ec2668ab1b466314403031c83a95c5efc81d2acf163/psutil-5.

【Python自动化运维之路Day8】基础篇之面向对象下篇

今日目录: 类成员 成员修饰符 特殊的类成员 面向对象相关联的其他知识 异常捕获与处理 设计模式之单例模式 一. 类成员 类的成员有:字段.方法和属性 关系图如下: 1. 字段: 字段分: 静态字段 普通字段 两者在定义和使用上有所区别,如下代码: class Province: contry = '中国' #静态字段,保存在类中 def __init__(self,name): self.name = name #普通字段,保存在对象中 在内存中的存储位置是不同的, 静态字段保存在类中, 而普

【Python自动化运维之路Day9】Socket

socket也可以认为是套接字是一种源IP地址和目的IP地址以及源端口号和目的端口号的组合.网络化的应用程序在开始任何通讯之前都必须要创建套接字.就像电话的插口一样,没有它就没办法通讯. socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) 我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我

python自动化运维之路4

装饰器 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果.相对于其它方式,装饰器语法简单,代码可读性高.因此,装饰器在Python项目中有广泛的应用. 装饰器的应用场景:饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大

【Python自动化运维之路Day2】

1. 常量命名规则 在Python中,会在变量命名上标明某变量是常量,通常采用全是大写的方式来标明,如: CONNECT= '127.0.0.1' PORT = '3306' 2.Python编译 python先把源码文件(.py)编译成字节码文件(.pyc) python3执行后,生成了一个__pycache__目录,pyc会在此目录下,python2执行可以看到直接生成了一个.pyc文件 pyc  与py  时间戳不同,pyc才去重新编译 3  数据 <1> str 1.str1+str2

python自动化运维之路~DAY1

刚学python,有大神给指点指点的吗? #!/usr/bin/env python#_*_coding:utf8_*_import getpass,syscount = 0match_info = False #用布尔值来标志用户密码是否匹配,默认是flasewhile count < 3: username = input("\033[32;1mAsk you for a username :\033[0m") with open("locked.txt"