详解python之反射机制
一、前言
1 | test.py |
1 | import test as ss |
我们要导入一个模块,可以使用import.现在有这样的需要,我动态输入一个模块名,可以随时访问到导入模块中的方法或者变量,怎么做呢?
1 | imp = input(“请输入你想导入的模块名:”) |
上面我们实现了动态输入模块名,从面使我们能够输入模块名并执行里面的函数。但是上面有一个缺点,那就是执行的函数被固定了。那么,我们能不能改进一下,动态输入函数名,并且来执行呢?
1 | #dynamic.py |
上面我们就实现了,动态导入一个模块,并且动态输入函数名然后执行相应功能。
当然上面还存在一点点小问题:那就是我的模块名有可能不是在本级目录中存放着,有可能是如下图存放方式:
那么这种方式我们该如何搞定呢?看下面代码:
1 | dd = __import__("lib.text.commons") #这样仅仅导入了lib模块 |
二、反射机制
上面说了那么多,到底什么是反射机制呢?
其实,反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!
先来介绍四个内置函数:
1 | 1. getattr()函数是Python自省的核心函数,具体使用大体如下: |
我们可以利用上述的四个函数,来对模块进行一系列操作.
1 | r = hasattr(commons,xxx)判断某个函数或者变量是否存在 |
注:getattr,hasattr,setattr,delattr对模块的修改都在内存中进行,并不会影响文件中真实内容。
三、实例
基于反射机制模拟web框架路由
需求:比如我们输入:www.xxx.com/commons/f1,返回f1的结果。
1 | # 动态导入模块,并执行其中函数 |