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实现html转ubb代码(html2ubb)
Jul 03 Python
Django集成百度富文本编辑器uEditor攻略
Jul 04 Python
Python中的Matplotlib模块入门教程
Apr 15 Python
Python队列的定义与使用方法示例
Jun 24 Python
python生成不重复随机数和对list乱序的解决方法
Apr 09 Python
Python 利用内置set函数对字符串和列表进行去重的方法
Jun 29 Python
解决Python3 控制台输出InsecureRequestWarning问题
Jul 15 Python
Python爬虫学习之翻译小程序
Jul 30 Python
python3 pathlib库Path类方法总结
Dec 26 Python
wxpython自定义下拉列表框过程图解
Feb 14 Python
python3使用diagrams绘制架构图的步骤
Apr 08 Python
教你怎么用Python操作MySql数据库
May 31 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开发大型项目的一点经验
2006/10/09 PHP
example1.php
2006/10/09 PHP
配置最新的PHP加MYSQL服务器
2006/10/09 PHP
PHP 批量删除数据的方法分析
2009/10/30 PHP
PHP合并数组+与array_merge的区别分析
2010/08/01 PHP
服务器web工具 php环境下
2010/12/29 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
smarty简单入门实例
2014/11/28 PHP
php中照片旋转 (orientation) 问题的正确处理
2017/02/16 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
vue下拉列表功能实例代码
2018/04/08 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
2018/09/22 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
pygame加载中文名mp3文件出现error
2017/03/31 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
彻底理解Python list切片原理
2017/10/27 Python
python编程嵌套函数实例代码
2018/02/11 Python
基于python绘制科赫雪花
2018/06/22 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
Centos下实现安装Python3.6和Python2共存
2018/08/15 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
简单了解Python3里的一些新特性
2019/07/13 Python
python 利用已有Ner模型进行数据清洗合并代码
2019/12/24 Python
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
机关财务管理制度
2014/01/17 职场文书
《小小雨点》教学反思
2014/02/18 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
工程部主管岗位职责
2015/02/12 职场文书
办公室主任个人总结
2015/02/28 职场文书
鲁冰花观后感
2015/06/10 职场文书
学习心得体会
2019/06/20 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS