本文共 2039 字,大约阅读时间需要 6 分钟。
本文用到的文件test.py,person.py,sqlserverhelper.py,mysqlhelper.py所在的工程如下图:
person.py文件内容:
class Person(): def __init__(self): self.name='python' def getName(self): return self.name
1》未使用反射:
test.py文件内容:
from person import Personp=Person()print p.getName()结果:
python
2》反射示例一:
test.py文件内容:
from person import Personp = globals()["Person"]()print getattr(p,'name')print getattr(p,'getName')()结果:
python
python3》反射示例二:(动态导入模块)
test.py文件内容:
module = __import__("person")p = getattr(module, "Person")()print hasattr(p,'name')print getattr(p,'name')print getattr(p,'getName')()结果: True python python 4》反射示例三:开发大型程序,期望能够随时切换数据库(动态导入)
sqlserverhelper.py文件内容:
#!/usr/bin/env python#coding:utf-8def count(): return 2name='sqlserverhelper'mysqlhelper.py文件内容:
#!/usr/bin/env python#coding:utf-8def count(): return 1name='mysqlhelper'test.py文件内容:
#!/usr/bin/env python#coding:utf-8temp='mysqlhelper'module=__import__(temp)#反射:以字符串的形式导入模块print module.count() #正常调用count函数func='count' #反射:以字符串的形式执行函数f=getattr(module,func) #查找函数countprint f() print hasattr(module,'fun'),hasattr(module,'count'),getattr(module,'count')print hasattr(module,'s'),hasattr(module,'name'),getattr(module,'name')运行test.py,结果:
1
1 False True <function count at 0x02937CB0> False True mysqlhelper若要切换到sqlserverhelper,仅需要修改一行,修改后的test.py如下:
temp='sqlserverhelper'#仅仅需要修改这一行module=__import__(temp)#反射:以字符串的形式导入模块print module.count() #正常调用count函数func='count' #反射:以字符串的形式执行函数f=getattr(module,func) #查找函数countprint f() print hasattr(module,'fun'),hasattr(module,'count'),getattr(module,'count')print hasattr(module,'s'),hasattr(module,'name'),getattr(module,'name')运行结果: 2 2 False True <function count at 0x02BC7CB0> False True sqlserverhelper
另外:
delattr(module,'count')#删除属性 hasattr(module,'count')#判断属性是否存在反射小结:
1》通过类名获得类的实例对象 2》通过方法名得到方法,实现调用 3》使用__import__方法导入模块之后,获得模块中的属性和方法使用getattr()方法 使用__import__只能导入文件(模块), 到class级别或函数级别或变量级别应该使用getattr。 获得类以后, 要创建实例对象, 在getattr()后再加上(), 不管属性和方法都使用getattr获得, 如果要调用方法, 使用getattr(xx,'method')() 友情链接: