python学习笔记-Day5(反射特殊方法OS模块)

Posted Cool King

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习笔记-Day5(反射特殊方法OS模块)相关的知识,希望对你有一定的参考价值。

反射

# 反射(或叫自省): 有时候我们会碰到这样的需求,需要执行对象的某个方法,或是需要对对象的某个字段赋值,而方法名或是字段名在编码代码时并不能确定,需要通过参数传递字符串的形式输入
# 这就是我们反射功能: 通过字符串形式去调用对象

# 例, 我有一个导向页面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文件的特殊方法

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变量

 

以上是关于python学习笔记-Day5(反射特殊方法OS模块)的主要内容,如果未能解决你的问题,请参考以下文章

python基础学习日志day5---os模块

python函数和常用模块,Day5

Day5—面向对象

Python学习笔记——Day5(转载)

day5模块学习 -- os模块学习

python学习笔记day5——常用模块学习