python学习笔记-Day6(反射、特殊方法、OS模块、sys模块、hashlib模块)
反射
# 反射(或叫自省): 有时候我们会碰到这样的需求,需要执行对象的某个方法,或是需要对对象的某个字段赋值,而方法名或是字段名在编码代码时并不能确定,需要通过参数传递字符串的形式输入 # 这就是我们反射功能: 通过字符串形式去调用对象 # 例, 我有一个导向页面commons.py def login(): print('登录') def home(): print('HOME PAGE') def logout(): print('logout !!!') # 我需要根据用户输入,去执行对应功能,使用反射就可以这么写 # index.py import commons def run(): inp = input('请输入要访问的url: ') if hasattr(commons, inp): func = getattr(commons,inp) func() else: print('404') run() # 例如,我在inp执行时输入login执行过程为下 # hasattr(commons, 'login') ,表示commons.login是否存在,存在则返回True # func = getattr(commons, 'login') ,表示将commons.login对象完全赋值给func # func() 调用执行对象 # 这里反射涉及两个内置函数: # hasattr() 判断接收字符串是否存在 # getattr() 获取接收字符串对象
# 上边反射了,某个模块的函数,而实际我们还可以连模块一起反射 # __import__() 以字符串形式导入模块 # 这样我们就可以这样改下我们run()函数 def run(): inp = input('请输入要访问的url: ') # 用户输入格式为 模块/函数 m, f = inp.split('/') # 将用户输入分为模块和函数 obj = __import__(m) # 以字符串形式导入模块 if hasattr(obj, f): # 判断模块中是否有此函数 func = getattr(obj, f) # 获取模块函数体 func() # 执行函数 else: print('404')
# 反射中还有以下两个内置函数
# setattr() 找到模块中,再设置一个函数对象
# delattr() 找到模块中,删除函数对象
注意: 我们上边例子hasattr()、getattr()、setattr()、delattr(),都是至少传入两个参数的(对象、名字)
# __import__ 导入模块特例 s = 'lib.test' obj = __import__(s) # 这时,import仅仅是import lib # 要使用: # obj = __import__(s, fromlist=True) # 才可以支持多级目录式导入模块
特殊方法
__file__ # 本文件的相对路径 __package__ # 文件在你的相对哪个路径下 # 例如,我的程序如下 |--bin | |--test.py |--index.py # index.py from bin import bin print(bin.__package__) ==> bin # 输出相对路径,就是这个,看起来毫无卵用的功能 __cache__ # 关于Pyc文件的特殊方法 __doc__ # 这个就是去查看我们函数中注释部分(三个引号)
OS模块
# 我的代码当前路径为:D:\MyCloud\oldboy\day6_0611 r = os.path.abspath(__file__) # 当前文件的绝对路径 print(r) ==> D:/MyCloud/oldboy/day6_0611/test2.py s = os.path.dirname(r) # 文件(或目录)所在的目录的相对路径 print(s) ==> D:\MyCloud\oldboy\day6_0611\test2.py # 这里因为pycharm原因,默认显示绝对路径,应该你在哪个路径下,它就显示相对与你执行此程序的路径 sys.path.append(os.path.dirname(r)) # 将当前文件目录(r),添加到系统PATH变量
# 用于提供系统级别的操作 # 其它方法 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所指向的文件或者目录的最后修改时间
sys模块
# sys模块提供对Python解释器相关的操作 sys.argv # 命令行参数List,第一个元素是程序本身路径 sys.exit(n) # 退出程序,正常退出时exit(0) sys.version # 获取Python解释程序的版本信息 sys.maxint # 最大的Int值 sys.path # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform # 返回操作系统平台名称 sys.stdin # 输入相关 sys.stdout # 输出相关 sys.stderror # 错误相关
# sys模块,进度条实例 import sys import time def view_bar(num, total): rate = float(num) / float(total) rate_num = int(rate * 101) r = '\r[%-100s]>%d%%' % ("*"*num,rate_num, ) # \r为将指针到第一位,这样就不会一直追加的输出,而是输出一回回到\r处,然后重新输出覆盖上一回输出 sys.stdout.write(r) sys.stdout.flush() # flush为将输出刷新到屏幕上 if __name__ == '__main__': for i in range(0, 101): time.sleep(0.1) view_bar(i, 101)
hashlib模块
# hashlib加密 import hashlib obj = hashlib.md5(bytes('xxoo',encoding='utf-8')) # 传入随机字符串,基于这个字符串再进行加密(类似于Key) obj.update(bytes('123',encoding='utf-8')) # 对字符串123进行加密,基于上边给的xxoo字符串(防止反解密) result = obj.hexdigest() # 获取加密后的md5值 print(result) ==> 585eda1b304bf7fbb7f071f73be54e0b

浙公网安备 33010602011771号