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 相关文章推荐
基于wxpython开发的简单gui计算器实例
May 30 Python
Python之os操作方法(详解)
Jun 15 Python
详解python中executemany和序列的使用方法
Aug 12 Python
Python决策树和随机森林算法实例详解
Jan 30 Python
python opencv之分水岭算法示例
Feb 24 Python
python线程中同步锁详解
Apr 27 Python
将tensorflow的ckpt模型存储为npy的实例
Jul 09 Python
Python实现TCP通信的示例代码
Sep 09 Python
Python3实现zip分卷压缩过程解析
Oct 09 Python
python 二维矩阵转三维矩阵示例
Nov 30 Python
python3 webp转gif格式的实现示例
Dec 10 Python
python如何安装下载后的模块
Jul 03 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 获取本地IP代码
2013/06/23 PHP
ThinkPHP页面跳转success与error方法概述
2014/06/25 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
JavaScript中setInterval的用法总结
2013/11/20 Javascript
JS控制一个DIV层在指定时间内消失的方法
2014/02/17 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
2016/06/21 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
详解Angular 4.x NgTemplateOutlet
2017/05/24 Javascript
详解使用angular的HttpClient搭配rxjs
2017/09/01 Javascript
Vue.js用法详解
2017/11/13 Javascript
nodejs多版本管理总结
2018/04/03 NodeJs
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python二叉树遍历的实现方法
2013/11/21 Python
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
python抽取指定url页面的title方法
2018/05/11 Python
如何在Django中设置定时任务的方法示例
2019/01/18 Python
Python3视频转字符动画的实例代码
2019/08/29 Python
3行Python代码实现图像照片抠图和换底色的方法
2019/10/10 Python
python 实现dict转json并保存文件
2019/12/05 Python
如何理解Python中的变量
2020/06/01 Python
全网最细 Python 格式化输出用法讲解(推荐)
2021/01/18 Python
美国市场上最实惠的送餐服务:Dinnerly
2018/03/18 全球购物
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
西岭雪山导游词
2015/02/06 职场文书
实习感想范文
2015/08/10 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python
SQL Server表分区删除详情
2021/10/16 SQL Server