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

 

posted @ 2016-06-15 22:56  Cool_King  阅读(275)  评论(0)    收藏  举报