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 编程之twisted详解及简单实例
Jan 28 Python
Python命令启动Web服务器实例详解
Feb 23 Python
Python正确重载运算符的方法示例详解
Aug 27 Python
在Python中执行系统命令的方法示例详解
Sep 14 Python
Python实现字符串与数组相互转换功能示例
Sep 22 Python
Python+matplotlib实现填充螺旋实例
Jan 15 Python
Python使用wxPython实现计算器
Jan 30 Python
Python读取视频的两种方法(imageio和cv2)
Apr 15 Python
Python3.5运算符操作实例详解
Apr 25 Python
python程序中的线程操作 concurrent模块使用详解
Sep 23 Python
PyQt5爬取12306车票信息程序的实现
May 14 Python
Python实现简单的猜单词
Jun 15 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字符串截取函数用法分析
2014/11/25 PHP
PHP验证信用卡卡号是否正确函数
2015/05/27 PHP
PHP自动生成表单代码分享
2015/06/19 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
2018/12/06 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
JavaScript File API文件上传预览
2016/02/02 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
Node.js创建HTTP文件服务器的使用示例
2018/05/11 Javascript
vue filters的使用详解
2018/06/11 Javascript
react 应用多入口配置及实践总结
2018/10/17 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
2019/10/29 Javascript
浅析python的Lambda表达式
2019/02/27 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
2020/09/24 Python
雅诗兰黛香港官网:Estee Lauder香港
2017/09/26 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
商业街策划方案
2014/05/31 职场文书
五一促销活动总结
2014/07/01 职场文书
2014年英语教学工作总结
2014/12/17 职场文书
辞职书格式样本
2015/02/26 职场文书
公司副总经理岗位职责
2015/04/08 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
二十年同学聚会感言
2015/07/30 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
大学迎新生的欢迎词
2019/06/25 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
mysql知识点整理
2021/04/05 MySQL
聊聊golang中多个defer的执行顺序
2021/05/08 Golang
php中配置文件保存修改操作 如config.php文件的读取修改等操作
2021/05/12 PHP
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android