猴砸

杂(八)

反射

一、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 = '\r%s>%d%%' % ('='*num,rate_num, )    #\r:当前行的首个位置
    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下为"\t\n",Linux下为"\n"
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
'''
posted @ 2017-09-22 19:29  猴砸  阅读(148)  评论(0编辑  收藏  举报