标签:
# 反射(或叫自省): 有时候我们会碰到这样的需求,需要执行对象的某个方法,或是需要对对象的某个字段赋值,而方法名或是字段名在编码代码时并不能确定,需要通过参数传递字符串的形式输入 # 这就是我们反射功能: 通过字符串形式去调用对象 # 例, 我有一个导向页面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文件的特殊方法
# 我的代码当前路径为: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变量
标签:
原文地址:http://www.cnblogs.com/coolking/p/5589344.html