入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

python使用反射机制实例化对象

创建时间:2018-01-19 投稿人: 浏览次数:620

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