Python实现动态加载模块、类、函数的方法分析


Posted in Python onJuly 18, 2017

本文实例讲述了Python实现动态加载模块、类、函数的方法。分享给大家供大家参考,具体如下:

动态加载模块:

方式1:系统函数__import__()
方式2:imp, importlib 模块
方式3:exec 函数

动态加载类和函数

首先,使用加载模块,使用内置函数提供的反射方法getattr(),依次按照层级获取模块->类\全局方法->类对象\类方法。

test_import_module.py

class ClassA:
  def test(self):
    print('test')
  int_value = 1
  str_value = __author__
# 全局方法,加载时会被调用
print(__file__, 'global function.')
if __name__ == '__main__':
  print(__file__, __name__)

test_import_module.py

# 注意:模块名不包括.py后缀
imp_module = 'test_import_class'
imp_class = 'ClassA'
# 方式1:使用__import__()导入模块
# 导入指定模块,导入时会执行全局方法。
ip_module = __import__(imp_module)
# dir()查看模块属性
print(dir(ip_module))
# 使用getattr()获取imp_module的类
test_class = getattr(ip_module, imp_class)
# 动态加载类test_class生成类对象
cls_obj = test_class()
# 查看对象属性
print(dir(cls_obj))
for attr in dir(cls_obj):
  # 加载非__前缀的属性
  if attr[0] != '_':
    # 获取导入obj方法。
    class_attr_obj = getattr(cls_obj, attr)
    # 判断类属性是否为函数
    if hasattr(class_attr_obj, '__call__'):
      # 执行函数
      class_attr_obj()
    else:
      # 输出类属性值
      print(attr, ' type:', type(class_attr_obj), ' value:', class_attr_obj)

输出结果

D:/work/python\test_import_class.py global function.
['ClassA', '__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'int_value', 'str_value', 'test']
int_value type: <class 'int'> value: 1
str_value type: <class 'str'> value: abc
test
# 方式2:使用importlib
# importlib相比__import__(),操作更简单、灵活,支持reload()
import importlib
ip_module = importlib.import_module('.', imp_module)
ip_module_cls = getattr(ip_module, imp_class)
cls_obj = ip_module_cls()
if 'int_value' in dir(cls_obj):
  print(cls_obj.int_value)
  cls_obj.int_value = 10
  print(cls_obj.int_value)
# reload()重新加载,一般用于原模块有变化等特殊情况。
# reload()之前该模块必须已经使用import导入模块。
# 重新加载模块,但原来已经使用的实例还是会使用旧的模块,而新生产的实例会使用新的模块,reload后还是用原来的内存地址。
ip_module = importlib.reload(ip_module)
print(getattr(ip_module, imp_class).int_value)
# 循环多次加载相同文件,手动修改文件数据,发现重新加载后输出内容变更。
from time import sleep
for i in range(30):
  ip_module = importlib.reload(ip_module)
  print(getattr(ip_module, imp_class).int_value)
  sleep(3)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python实现绘制树枝简单示例
Jul 24 Python
Python黑魔法Descriptor描述符的实例解析
Jun 02 Python
Python实现的中国剩余定理算法示例
Aug 05 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
Oct 07 Python
pytorch 数据集图片显示方法
Jul 26 Python
python实现决策树分类
Aug 30 Python
对Python定时任务的启动和停止方法详解
Feb 19 Python
python飞机大战pygame游戏背景设计详解
Dec 17 Python
pytorch中的上采样以及各种反操作,求逆操作详解
Jan 03 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
Aug 17 Python
python 中的9个实用技巧,助你提高开发效率
Aug 30 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
Jan 12 Python
Python使用plotly绘制数据图表的方法
Jul 18 #Python
python中日志logging模块的性能及多进程详解
Jul 18 #Python
浅谈python中的__init__、__new__和__call__方法
Jul 18 #Python
Pycharm编辑器技巧之自动导入模块详解
Jul 18 #Python
python对DICOM图像的读取方法详解
Jul 17 #Python
Python实现excel转sqlite的方法
Jul 17 #Python
PyChar学习教程之自定义文件与代码模板详解
Jul 17 #Python
You might like
PHP4与PHP5的时间格式问题
2008/02/17 PHP
php中的静态变量的基本用法
2014/03/20 PHP
关于PHP中字符串与多进制转换函数的实例代码
2016/11/03 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
Javascript Global对象
2009/08/13 Javascript
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
JavaScript实现节点的删除与序号重建实例
2015/08/05 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
jquery实现点击弹出可放大居中及关闭的对话框(附demo源码下载)
2016/05/10 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
浅谈jquery.form.js的ajaxSubmit和ajaxForm的使用
2016/09/09 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
彻底搞懂JavaScript中的apply和call方法(必看)
2017/09/18 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
解决在Bootstrap模糊框中使用WebUploader的问题
2018/03/22 Javascript
使用Angular CLI生成路由的方法
2018/03/24 Javascript
Node.js文件编码格式的转换的方法
2018/04/27 Javascript
vue实现与安卓、IOS交互的方法
2018/11/02 Javascript
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
微信小程序跨页面传递data数据方法解析
2019/12/13 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
Windows下python3.6.4安装教程
2018/07/31 Python
解决pycharm安装后代码区不能编辑的问题
2018/10/28 Python
Python解析json代码实例解析
2019/11/25 Python
tensorflow转换ckpt为savermodel模型的实现
2020/05/25 Python
python3 re返回形式总结
2020/11/20 Python
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
一分钟演讲稿
2014/04/30 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android