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实现的使用telnet登陆聊天室实例
Jun 17 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
Oct 12 Python
python3中zip()函数使用详解
Jun 29 Python
python使用Matplotlib画条形图
Mar 25 Python
python基于递归解决背包问题详解
Jul 03 Python
windows下python虚拟环境virtualenv安装和使用详解
Jul 16 Python
图文详解Django使用Pycharm连接MySQL数据库
Aug 09 Python
pytorch 输出中间层特征的实例
Aug 17 Python
Python GUI自动化实现绕过验证码登录
Jan 10 Python
python线性插值解析
Jul 05 Python
python 实现两个变量值进行交换的n种操作
Jun 02 Python
python中super()函数的理解与基本使用
Aug 30 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
php图片添加文字水印实现代码
2016/03/15 PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
2017/08/10 PHP
js 动态选中下拉框
2009/11/26 Javascript
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
2009/11/27 Javascript
nodeType属性返回被选节点的节点类型介绍
2013/11/22 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
javascript中数组方法汇总
2015/07/07 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
JS使用正则表达式验证身份证号码
2017/06/23 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
2019/05/12 Javascript
vue遍历生成的输入框 绑定及修改值示例
2019/10/30 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
vue项目中使用bpmn-自定义platter的示例代码
2020/05/11 Javascript
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
Python实现文件内容批量追加的方法示例
2017/08/29 Python
Python实现的破解字符串找茬游戏算法示例
2017/09/25 Python
Django如何配置mysql数据库
2018/05/04 Python
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
HTML5中meta属性的使用方法
2016/02/29 HTML / CSS
Nordgreen美国官网:在线购买极简主义斯堪的纳维亚手表
2019/07/24 全球购物
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
思想品德自我鉴定
2013/10/12 职场文书
物流专业大学生求职信范文
2013/10/28 职场文书
市场营销专业毕业生自荐信
2013/11/02 职场文书
商铺租赁意向书
2014/04/01 职场文书
大二学习计划书范文
2014/04/27 职场文书
蛋糕店创业计划书
2014/05/06 职场文书
治安消防安全责任书
2014/07/23 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书
优秀毕业生主要事迹材料
2015/11/04 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
学生检讨书范文
2019/06/24 职场文书