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 03 Python
Python的设计模式编程入门指南
Apr 02 Python
python操作列表的函数使用代码详解
Dec 28 Python
tensorflow实现KNN识别MNIST
Mar 12 Python
python 统计列表中不同元素的数量方法
Jun 29 Python
selenium+python实现1688网站验证码图片的截取功能
Aug 14 Python
python: 判断tuple、list、dict是否为空的方法
Oct 22 Python
numpy.linspace函数具体使用详解
May 27 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
Dec 18 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
Feb 11 Python
Python如何省略括号方法详解
Mar 21 Python
关于 Python json中load和loads区别
Nov 07 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
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
PHP实时显示输出
2008/10/02 PHP
php 上传文件类型判断函数(避免上传漏洞 )
2010/06/08 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
php中请求url的五种方法总结
2017/07/13 PHP
PHP获取MySQL执行sql语句的查询时间方法
2018/08/21 PHP
php实现简易计算器
2020/08/28 PHP
js文字滚动停顿效果代码
2008/06/28 Javascript
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
jquery.validate使用攻略 第一部
2010/07/01 Javascript
让textarea自动调整大小的js代码
2011/04/12 Javascript
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
在Node.js中实现文件复制的方法和实例
2014/06/05 Javascript
javascript实现tab切换的四种方法
2015/11/05 Javascript
Immutable 在 JavaScript 中的应用
2016/05/02 Javascript
jquery Ajax实现Select动态添加数据
2017/06/08 jQuery
jquery对table做排序操作的实例演示
2017/08/10 jQuery
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
2017/11/20 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
JavaScript数组方法的错误使用例子
2018/09/13 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
javascript利用键盘控制小方块的移动
2020/04/20 Javascript
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
python中常用的各种数据库操作模块和连接实例
2014/05/29 Python
Python中的并发编程实例
2014/07/07 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
以设计师精品品质提供快速时尚:Mostata
2019/05/10 全球购物
团日活动总结
2014/04/28 职场文书
2014年幼儿园园长工作总结
2014/12/17 职场文书
学校后勤工作总结2015
2015/05/15 职场文书
小学毕业教师寄语
2019/06/21 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
PHP中国际化的字符串排序和比较对象详解
2021/08/23 PHP