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

猜你喜欢

转载自blog.csdn.net/lom9357bye/article/details/79107711