利用python自省函数实现类java反射

前言

最近在搞python的小项目,其中遇到了灵活性的需求,所谓灵活性说的就是有没有类似于像java那样的反射机制呢?随后查阅了大量相关资料,发现python中的自省函数,利用它们便可实现类java反射的机制,目的就是通过配置文件的形式动态化 加载相关的包,模块,类的实例化,方法。用简单易懂的话来说就是,当需求有变动时,通用的框架代码不需要任何修改,也就是 java中的开闭原则(Open-Closed Principle, OCP),而通过配置文件的形式便可以完成新需求的功能。

python自省用到的函数

  1. __import__()
  2.  getattr  

需求介绍

这里写图片描述

比如我现在在read_file.py这个模块想要动态的获取service包下的所有模块,而通过把模块的名字写入配置文件中,从配置文件中读取,这样就可以灵活的实现java中的配置化代码,也就是java中的“反射机制”…例如我在配置文件中写入channel_a的名字,在read_file中读取配置文件名字,就可以加载这个模块并调用其中的方法,如果写入tj_data,则会加载tj_data中的模块方法。

代码实现

1.动态加载包下的模块

'''
__import__("service",fromlist=[channel_flag]),这个方法类似java映射,python叫自省
             "service."      : 代表service包下
             channel_flag   : 通过配置文件读取到的动态化模块名称
             fromlist=['*'] : 必须写,表示了从包下导入的模块,*是通配符,任何都导
'''
channel = __import__("service." + channel_flag, fromlist=['*'])

2.生成实例对象,调用相关方法

# 获取模块的类
clazz = getattr("模块的名字(xx.py)", "模块中的类对象")
# 实例化对象,并且调用对应的方法
exe_method = getattr(clazz(), method)
#可以将此方法返回给上级调用者
return exe_method()

总结

以上就是利用python自省函数实现java类反射,第一,动态import相关模块名字,第二,getattr生成实例化对象,或者通过实例化对象寻找对应的方法。

猜你喜欢

转载自blog.csdn.net/s740556472/article/details/80480785