# 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前缀
,相当于抛弃了commons
和user
两个导入的功能,所以以上代码并不完善,需求复杂后,还是需要对请求的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的反射机制
经验总结扩展阅读
- 自动化运维?看看Python怎样完成自动任务调度?
- 26 python进阶collections标准库
- jvm双亲委派机制详解
- Python基础指面向对象:2、动静态方法
- Python基础之面向对象:3、继承与派生
- 如何免安装使用 Python?推荐 17 个在线的 Python 解释器!
- Python处理刚刚,分钟,小时,天前等时间
- python渗透测试入门——取代netcat
- 图文全面详解 Kafka 架构和原理机制
- 六 Selenium4+Python3系列 - Selenium的三种等待,强制等待、隐式等待、显式等待