反射
一、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 '''