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写冒泡排序代码
Apr 12 Python
Python装饰器实现几类验证功能做法实例
May 18 Python
python logging日志模块的详解
Oct 29 Python
动态规划之矩阵连乘问题Python实现方法
Nov 27 Python
Python中的单继承与多继承实例分析
May 10 Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 Python
对Python中plt的画图函数详解
Nov 07 Python
django 基于中间件实现限制ip频繁访问过程详解
Jul 30 Python
python从PDF中提取数据的示例
Oct 30 Python
Django集成MongoDB实现过程解析
Dec 01 Python
python Scrapy框架原理解析
Jan 04 Python
python3 实现mysql数据库连接池的示例代码
Apr 17 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
php将会员数据导入到ucenter的代码
2010/07/18 PHP
PHP扩展开发入门教程
2015/02/26 PHP
PHP中的一些常用函数收集
2015/05/26 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
2017/05/04 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
VBScript版代码高亮
2006/06/26 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
Javascript常用字符串判断函数代码分享
2014/12/08 Javascript
ashx文件获取$.ajax()方法发送的数据
2016/05/26 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
2016/09/22 Javascript
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
2018/11/14 Javascript
vue组件通信传值操作示例
2019/01/08 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
python使用cookielib库示例分享
2014/03/03 Python
Python爬虫爬取百度搜索内容代码实例
2020/06/05 Python
Python字符串函数strip()原理及用法详解
2020/07/23 Python
CSS3的first-child选择器实战攻略
2016/04/28 HTML / CSS
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
毕业生实习鉴定
2013/12/11 职场文书
如何写早恋检讨书
2014/09/10 职场文书
信访稳定工作汇报
2014/10/27 职场文书
给领导的感谢信范文
2015/01/23 职场文书
2019年家电促销广告语集锦
2019/10/21 职场文书
Spring Security动态权限的实现方法详解
2022/06/16 Java/Android