之前在做数据解析的时候,发现不同类别的数据解析的流程是一样的,只不过每次去查询获取数据的时候表不相同,为了代码能够简洁一些,想到了先创建一个父类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