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处理json数据中的中文
Mar 06 Python
python中argparse模块用法实例详解
Jun 03 Python
Python字典实现简单的三级菜单(实例讲解)
Jul 31 Python
对Python中数组的几种使用方法总结
Jun 28 Python
pytorch 数据集图片显示方法
Jul 26 Python
Python函数中参数是传递值还是引用详解
Jul 02 Python
200行python代码实现2048游戏
Jul 17 Python
Python socket模块ftp传输文件过程解析
Nov 05 Python
Jupyter Notebook的连接密码 token查询方式
Apr 21 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
Jul 06 Python
用Python实现职工信息管理系统
Dec 30 Python
PyQt5实现多张图片显示并滚动
Jun 11 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程序时遇到的三个问题
2012/01/17 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
PHP封装CURL扩展类实例
2015/07/28 PHP
Twig模板引擎用法入门教程
2016/01/20 PHP
浅谈PHP表单提交(POST&amp;GET&amp;URL编/解码)
2017/04/03 PHP
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
2014/04/12 Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
2016/05/18 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
Javascript缓存API
2016/06/14 Javascript
vue自定义指令实现v-tap插件
2016/11/03 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
编写React组件项目实践分析
2018/03/04 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
如何在selenium中使用js实现定位
2020/08/18 Javascript
Python tempfile模块学习笔记(临时文件)
2014/05/25 Python
Python脚本实现格式化css文件
2015/04/08 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
Python使用matplotlib绘制动画的方法
2015/05/20 Python
python skimage 连通性区域检测方法
2018/06/21 Python
django如何连接已存在数据的数据库
2018/08/14 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
英国创新设计文具、卡片和礼品包装网站:Paperchase
2018/07/14 全球购物
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
办公室秘书自我鉴定
2014/01/18 职场文书
预备党员的自我评价
2014/03/12 职场文书
路政管理求职信
2014/06/18 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
电影圆明园观后感
2015/06/03 职场文书
学生会自荐信
2019/05/16 职场文书