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