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 相关文章推荐
vc6编写python扩展的方法分享
Jan 17 Python
Python def函数的定义、使用及参数传递实现代码
Aug 10 Python
利用Hyperic调用Python实现进程守护
Jan 02 Python
python实现画圆功能
Jan 25 Python
Python爬虫包BeautifulSoup实例(三)
Jun 17 Python
详解Python做一个名片管理系统
Mar 14 Python
Python新手学习函数默认参数设置
Jun 03 Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 Python
简述python&amp;pytorch 随机种子的实现
Oct 07 Python
matplotlib教程——强大的python作图工具库
Oct 15 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 Python
python利用appium实现手机APP自动化的示例
Jan 26 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
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
Yii中CGridView关联表搜索排序方法实例详解
2014/12/03 PHP
Zend Framework教程之Zend_Db_Table用法详解
2016/03/21 PHP
jQuery Ajax使用 全解析
2010/12/15 Javascript
web基于浏览器的本地存储方法应用
2012/11/27 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
Vue.JS入门教程之自定义指令
2016/12/08 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
jquery.uploadView 实现图片预览上传功能
2017/08/10 jQuery
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
基于axios封装fetch方法及调用实例
2018/02/05 Javascript
AngularJS创建一个上传照片的指令实例代码
2018/02/24 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
vuex提交state&amp;&amp;实时监听state数据的改变方法
2018/09/16 Javascript
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
Linux下编译安装MySQL-Python教程
2015/02/02 Python
简析Python的闭包和装饰器
2016/02/26 Python
Python入门_学会创建并调用函数的方法
2017/05/16 Python
Python中join函数简单代码示例
2018/01/09 Python
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
python生成密码字典的方法
2018/07/06 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
Python3自动生成MySQL数据字典的markdown文本的实现
2020/05/07 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
杭州-DOTNET笔试题集
2013/09/25 面试题
金融行业务员的自我评价
2013/12/13 职场文书
迟到检讨书400字
2014/01/13 职场文书
保护水资源的标语
2014/06/17 职场文书
2014年民政局关于保密工作整改措施
2014/09/19 职场文书
解除劳动合同证明书
2014/09/26 职场文书
创先争优宣传标语
2014/10/08 职场文书
红十字会救护培训简讯
2015/07/20 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js