27 python反射机制( 三 )


# visit.pydef run():inp = input("请输入您想访问页面的url:").strip()# modules代表导入的模块,func代表导入模块里面的方法modules, func = inp.split('/')# 只新增了fromlist=Trueobj_module = __import__('lib.' + modules, fromlist=True)if hasattr(obj_module, func):getattr(obj_module, func)()else:print("404")if __name__ == '__main__':run()运行run方法,结果如下:
请输入您想访问页面的url:connectdb/conn已连接mysql成功了,但是我写死了lib前缀,相当于抛弃了commonsuser两个导入的功能,所以以上代码并不完善,需求复杂后,还是需要对请求的url做一下判断
def getf(module, func):"""抽出公共部分"""if hasattr(module, func):func = getattr(module, func)func()else:print('404')def run():inp = input("请输入您想访问页面的url:").strip()if len(inp.split('/')) == 2:# modules代表导入的模块,func代表导入模块里面的方法modules, func = inp.split('/')obj_module = __import__(modules)getf(obj_module, func)elif len(inp.split("/")) == 3:p, module, func = inp.split('/')obj_module = __import__(p + '.' + module, fromlist=True)getf(obj_module, func)if __name__ == '__main__':run()运行run函数,结果如下:
请输入您想访问页面的url:lib/connectdb/conn已连接mysql请输入您想访问页面的url:user/add_user添加用户当然你也可以继续优化代码,现在只判断了有1个斜杠和2个斜杠的,如果目录层级更多呢,这个暂时不考虑,本次是为了了解python的反射机制

经验总结扩展阅读