python使用反射机制实例化对象
之前在做数据解析的时候,发现不同类别的数据解析的流程是一样的,只不过每次去查询获取数据的时候表不相同,为了代码能够简洁一些,想到了先创建一个父类A,每个数据类别对应一个A的子类,在子类中实现数据查询的方法,然后通过获取A的所有子类对象,用反射机制实例化对象,再调用数据查询的方法来完成所有类别的数据解析工作,这样如果再新增一个类别,只需要再添加一个A的子类对象即可。
例子:
项目结构如下:
model.py:
model中创建了父类A和它的两个子类B和C
class A(object):
def print_name(self):
print("this is A")
class B(A):
def print_name(self):
print("this is B")
class C(A):
def print_name(self):
print("this is C")
reflect.py
(1)首先获取A的所有子类对象
(2)利用反射机制实例化子类对象
(3)调用子类对象的print_name方法
from model.m import A
if __name__ == "__main__":
# 获取A的所有子类
sub_class_list = A.__subclasses__()
for i in range(len(sub_class_list)):
# 获取子类的类名
class_name=sub_class_list[i].__name__
print(class_name)
# 导入model模块
model_module = __import__("model")
"""
如果模块导入成功,该模块下的所有py文件会作为模块的属性,因此使用getattr(模块,文件名)获取即可
文件名不需要加.py后缀
"""
m_py = getattr(model_module, "m")
# 根据子类名称从m.py中获取该类
obj_class_name = getattr(m_py, class_name)
# 实例化对象
obj = obj_class_name()
# 调用print_name方法
getattr(obj, "print_name")()
输出结果:
B
this is B
C
this is C
参考:http://blog.csdn.net/geekster/article/details/17093623
阅读更多
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了