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 相关文章推荐
以Flask为例讲解Python的框架的使用方法
Apr 29 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
Apr 11 Python
浅谈Python实现贪心算法与活动安排问题
Dec 19 Python
磁盘垃圾文件清理器python代码实现
Aug 24 Python
python实现简单淘宝秒杀功能
May 03 Python
Python2包含中文报错的解决方法
Jul 09 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
Jun 04 Python
Python登录系统界面实现详解
Jun 25 Python
解决Django加载静态资源失败的问题
Jul 28 Python
PyTorch 解决Dataset和Dataloader遇到的问题
Jan 08 Python
python查看矩阵的行列号以及维数方式
May 22 Python
Python 用__new__方法实现单例的操作
Dec 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
全国FM电台频率大全 - 22 重庆市
2020/03/11 无线电
php生成随机数或者字符串的代码
2008/09/05 PHP
php cache类代码(php数据缓存类)
2010/04/15 PHP
用PHP实现的四则运算表达式计算实现代码
2011/08/02 PHP
浅析十款PHP开发框架的对比
2013/07/05 PHP
php合并js请求的例子
2013/11/01 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
jQuery 监控键盘一段时间没输入
2016/04/22 Javascript
原生JS实现匀速图片轮播动画
2016/10/18 Javascript
SVG描边动画
2017/02/23 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
移动端使用localResizeIMG4压缩图片
2017/04/22 Javascript
Node.js中的cluster模块深入解读
2018/06/11 Javascript
JavaScript this绑定过程深入详解
2018/12/07 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
python使用 HTMLTestRunner.py生成测试报告
2017/10/20 Python
python模块之paramiko实例代码
2018/01/31 Python
Python3.7中安装openCV库的方法
2018/07/11 Python
浅析python redis的连接及相关操作
2019/11/07 Python
Python实现从N个数中找到最大的K个数
2020/04/02 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
CSS3中利用animation属性创建雪花飘落特效
2014/05/14 HTML / CSS
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
葡萄牙航空官方网站:TAP Air Portugal
2019/10/31 全球购物
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
面向对象概念面试题(.NET)
2016/11/04 面试题
舞蹈比赛获奖感言
2014/02/04 职场文书
上班玩手机检讨书
2014/02/17 职场文书
文明之星事迹材料
2014/05/09 职场文书
我是一名护士演讲稿
2014/08/28 职场文书
2016年春季运动会通讯稿
2015/11/25 职场文书
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB