杂(八)
反射
一、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
'''

浙公网安备 33010602011771号