• 杂(八)


    反射

    一、getattr()、hashattr()

    1、基础储备

    1.1、函数里面的函数名与字符串里面的变量的区别

    如下代码中,f1 与 'f1'是不一样的

    def f1():
        print('F1')
    f1()    #函数名
    
    s = 'f1' #字符串的对象
    #f1 与 'f1'是不一样的
    

    1.2、模块里面可以含有函数==》函数是模块的成员

    2、普通的页面操作

    commons页面代码

    def login():
        print('登录主页面')
    
    def logout():
        print('退出页面')
    
    def home():
        print('主页面')
    

    index页面代码

    import commons
    
    def run():
        inp = input("请输入要访问的url:")
        if inp == 'login':
            commons.login()
        elif inp == 'logout':
            commons.logout()
        elif inp == 'home':
            commons.home()
        else:
            print('404')
        
    
    if __name__ == '__main__':
        run()
    

    3、概念相关

    3.1、反射:利用字符串的形式,去对象(模块)中操作(寻找/检查/删除/设置)成员

    3.2、内置函数getattr():获取模块中的属性(成员)

     4、getattr():获取模块中的成员

    4.1、getattr(commons,'login'):从commons模块中去查找成员login

    4.2、login:函数名,代指函数体

    5、hash():是否模块里面包含相对应的成员

    6、利用反射进行优化程序

    commons文件

    def login():
        print('登录主页面')
    
    def logout():
        print('退出页面')
    
    def home():
        print('主页面')
    

    index页面

    import commons
    
    def run():
        inp = input("请输入要访问的url:")
        if hasattr(commons,inp):
            func = getattr(commons,inp)
            func()
        else:
            print('404')
    
    if __name__ == '__main__':
        run()
    
    
    #打印结果
    '''
    请输入要访问的url:99
    404
    
    请输入要访问的url:login
    登录主页面
    '''
    

    二、setattr()、delattr()、以字符串形式导入模块

    1、setattr():添加(设置)模块中的成员

    2、delattr():删除模块中的成员

    3、利用反射实现导入模块

    3.1、以字符串的形式导入模块

    def run():
        inp = input('请输入要访问的地址:')
        m,f = inp.split('/')
        obj = __import__(m)
        if hasattr(obj,f):
            func = getattr(obj,f)
            func()
        else:
            print('404')
    if __name__ == '__main__':
        run()
        
        
    #打印结果
    '''
    请输入要访问的地址:commons/login
    登录主页面
    '''
    

     3.2、如下代码,导入的模块效果是一样的,只是第一种方式是以字符串的形式进行导入应用的

    obj = __import__('commons')
    obj.login()
    
    import commons as obj
    obj.login()
    
    #打印结果
    '''
    登录主页面
    登录主页面
    '''
    

    三、不同目录导入模块

    1、前置条件:

    1.1、commons模块在lib文件夹里面,需要操作到commons模块

    def run():
        inp = input('请输入要访问的地址:')
        #import lib.commons
        m,f = inp.split('/')
        obj = __import__('lib.'+ m,fromlist = True)  #字符串的拼接来实现import lib.commons
        if hasattr(obj,f):
            func = getattr(obj,f)
            func()
        else:
            print('404')
    if __name__ == '__main__':
        run()
    

    1.2、注意点

    利用__import__导入文件夹下面的模块时,需要在后面加个fromlist = True,不然只是进去到了lib文件而已

    模块补充

    一、python模块中特殊变量

    1、vars()

    1.1、作用查看导入的模块里面有哪些标量

    1.2、相关代码

    import s2
    
    print(vars(s2))
    

    2、__file__

    2.1、定义:获取当前运行的py文件所在的路径(不一定是绝对路径,需要绝对路径的话,参照os模块中abspath方法)

    2.2、相关代码

    print(__file__)
    
    #打印结果:/Users/monkey/eleme/code/515151/s1.py
    

    3、__doc__

    3.1、获取文件的注释,以三引号包含起来的注释

    3.2、相关代码

    '''
    我是注释
    '''
    print(__doc__)
    
    #打印结果:我是注释
    

    4、__cached__

    4.1、python导入另外一个模块的时候,会自动生成一个.pyc文件(字节码)

    4.2、作用:指定字节码的路径

    5、__name__

    5.1、特性:只有执行当前文件的特殊变量__name__   ==  "__main__"。否则不等于__main__

    5.2、只有执行主文件的时候再执行,如果是导入的模块不执行

    s1文件

    def run():
        print('run')
    
    if __name__ == '__main__':   #只有执行主文件的时候再执行,如果是导入的模块不执行,如果不加的话,都会被执行
        run()
    

    s2文件

    import s1
    

    6、__package__

    6.1、获取模块相对应的包

    6.2、相关代码

    #导入的模块中有相对应的包
    from lib import commons
    print(commons.__package__)
    
    #打印结果:lib
    
    #执行的模块里面没有包
    print(__package__)
    
    #打印结果:None
    

    二、sys模块

    1、sys.argv()

    命令行参数List,第一个元素是程序本身路径

    2、sys.exit(n)

    退出程序,正常退出时exit(0)

    3、sys.version

    获取Python解释程序的版本信息

    4、sys.maxint

    最大的Int

    5、sys.path

    返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值

    6、sys.platform

    返回操作系统平台名称

    7、sys.stdin

     输入相关

    8、sys.stdout

    输出相关

    9、sys.stderror

    错误相关

    10、进度百分比

    import sys
    import time
    
    
    def view_bar(num, total):
        rate = num / total
        rate_num = int(rate * 100)
        r = '
    %s>%d%%' % ('='*num,rate_num, )    #
    :当前行的首个位置
        sys.stdout.write(r)  #不加换行符
        sys.stdout.flush()  #将前面输出的内容清空
    
    
    if __name__ == '__main__':
        for i in range(0, 101):
            time.sleep(0.1)
            view_bar(i, 100)
    
    
    #打印结果:====================================================================================================>100%
    

    三、os模块:用于提供系统级别的操作

    1、os.path.dirname()

    1.1、获取某个文件的上级目录

    1.2、相关代码

    #获取上级目录
    import os
    ret = os.path.dirname(os.path.abspath(__file__))
    print(ret)
    #打印结果:/Users/monkey/eleme/code/515151
    
    #获取上级的上级目录
    import os
    ret = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    print(ret)
    #打印结果:/Users/monkey/eleme/code 

    1.3、用处:添加变量的时候使用

    2、os.path.abspath()

    2.1、获取某个文件的绝对路径

    2.2、相关代码

    import os
    print(os.path.abspath(__file__))
    #打印结果:/Users/monkey/eleme/code/515151/s1.py
    

    2.3、用处:添加变量的时候使用

    3、其他方法

    os.getcwd()                 获取当前工作目录,即当前python脚本工作的目录路径
    os.chdir("dirname")         改变当前脚本工作目录;相当于shell下cd
    os.curdir                   返回当前目录: ('.')
    os.pardir                   获取当前目录的父目录字符串名:('..')
    os.makedirs('dir1/dir2')    可生成多层递归目录
    os.removedirs('dirname1')   若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    os.mkdir('dirname')         生成单级目录;相当于shell中mkdir dirname
    os.rmdir('dirname')         删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    os.listdir('dirname')       列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
    os.remove()                 删除一个文件
    os.rename("oldname","new")  重命名文件/目录
    os.stat('path/filename')    获取文件/目录信息
    os.sep                      操作系统特定的路径分隔符,win下为"\",Linux下为"/"
    os.linesep                  当前平台使用的行终止符,win下为"	
    ",Linux下为"
    "
    os.pathsep                  用于分割文件路径的字符串 ;分号
    os.name                     字符串指示当前使用平台。win->'nt'; Linux->'posix'
    os.system("bash command")   运行shell命令,直接显示
    os.environ                  获取系统环境变量
    os.path.abspath(path)       返回path规范化的绝对路径
    os.path.split(path)         将path分割成目录和文件名二元组返回
    os.path.dirname(path)       返回path的目录。其实就是os.path.split(path)的第一个元素
    os.path.basename(path)      返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
    os.path.exists(path)        如果path存在,返回True;如果path不存在,返回False
    os.path.isabs(path)         如果path是绝对路径,返回True
    os.path.isfile(path)        如果path是一个存在的文件,返回True。否则返回False
    os.path.isdir(path)         如果path是一个存在的目录,则返回True。否则返回False
    os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
    os.path.getatime(path)      返回path所指向的文件或者目录的最后存取时间
    os.path.getmtime(path)      返回path所指向的文件或者目录的最后修改时间
    curdir = '.'
    pardir = '..'
    extsep = '.'
    sep = '\'
    pathsep = ';'
    altsep = '/'
    defpath = '.;C:\bin'
    devnull = 'nul'
    

    四、加密模块

    1、hashlib

    1.1、用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

    1.2、一般密码不用明文保存,一般用md5形式的密文进行保存

    1.3、md5是不可逆的,只能将字符串加密成md5值,但是不能将相对应的md5值解密成相对应的密码

    1.4、再去登录的时候检测密码对不对:登录和检测的密码都变成密文的形式进行比较

    2、加密处理

    import hashlib
    obj = hashlib.md5() #加密处理
    obj.update(bytes('123',encoding='utf-8'))  
    result = obj.hexdigest()  #获取加密后的值
    print(result)
    
    #打印结果
    '''
    202cb962ac59075b964b07152d234b70
    '''
     

    3、进一步加密操作

    如果都是用密码123利用md5 进行加密操作之后,都是一样的,这样存在不安全,需要重在生成一个key来包装

    import hashlib
    obj = hashlib.md5(bytes('dashdkash',encoding='utf-8'))   #重新再加一个key,增加安全
    obj.update(bytes('123',encoding='utf-8'))  #加密处理
    result = obj.hexdigest()  #获取加密后的值
    print(result)
    
    #打印结果
    '''
    202cb962ac59075b964b07152d234b70
    '''
    
  • 相关阅读:
    [团队项目] Scrum 项目 3.0 SCRUM 流程的步骤2: Spring 计划
    《构建之法》第6-7章读后感
    【操作系统】实验二 作业调度模拟程序
    团队项目2.0软件改进分析MathAPP
    团队项目
    结对编程2.0
    电影(网剧))项目
    实验0 了解和熟悉操作系统
    复利计算
    学习进度条
  • 原文地址:https://www.cnblogs.com/little-turtle/p/7517689.html
Copyright © 2020-2023  润新知