当前位置:首页 > 编程教程 > Python技术文章 > Python实现动态加载模块、类、函数的方法分析

实例解析Python实现动态加载模块、类、函数的方法

  • 发布时间:
  • 作者:码农之家
  • 点击:69

这篇文章主要知识点是关于Python、动态加载、模块、类、函数、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Python接口自动化测试
  • 类型:Python自动化大小:61.2 MB格式:PDF作者:王浩然
立即下载

Python实现动态加载模块、类、函数的方法分析

本文实例讲述了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数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

Python 相关电子书
学习笔记
网友NO.970665

python3学习之异常处理及文件的各种操作

本篇文章主要讲述的是Python3的异常处理以及文件的各种操作,具有一定的收藏价值,感兴趣的朋友可以了解一下,希望对你有所帮助。 异常处理:是为了避免程序因为一个小问题而导致程序终止 try: 可能出现异常的代码块 except: 出现异常的处理方法 else: 没出错时要执行的代码 函数中如果出现异常,处理之后正常执行,没有处理,异常会抛给调用处,在调用处处理,如果一直到全局作用域,没有处理,则出现异常,程序终止 出现异常以后,所有异常信息会被保存在一个专门的异常对象中,而异常传播时,实际上就是将异常对象抛给了调用处 except后没有跟异常类型,会捕获所有异常,如果写了固定异常类型,则只会捕获该类型异常,except可写多个,同时捕获多种不同的异常,最后一个except一般写except Exception:捕获所有异常 except Exception as 变量名:将捕获到的……

网友NO.484994

Python实现多线程HTTP下载器示例

本文将介绍使用Python编写多线程HTTP下载器,并生成.exe可执行文件。 环境:windows/Linux + Python2.7.x 单线程 在介绍多线程之前首先介绍单线程。编写单线程的思路为: 1.解析url; 2.连接web服务器; 3.构造http请求包; 4.下载文件。 接下来通过代码进行说明。 解析url 通过用户输入url进行解析。如果解析的路径为空,则赋值为'/';如果端口号为空,则赋值为"80”;下载文件的文件名可根据用户的意愿进行更改(输入'y'表示更改,输入其它表示不需要更改)。 下面列出几个解析函数: #解析host和pathdef analyHostAndPath(totalUrl): protocol,s1 = urllib.splittype(totalUrl) host, path = urllib.splithost(s1) if path == '': path = '/' return host, path#解析portdef analysisPort(host): host, port = urllib.splitport(host) if port is None: return 80 return port#解析filenamedef analysisFilename(path): filename = path.split('/')[-1] if '.' not in ……

网友NO.169927

linux环境中没有网络怎么下载python

有时候在无法联网的情况下需要搭建环境,且必须使用之前的环境,因为你的代码需要在同样的环境下运行。这样方便开发 方法一: 1.下载指定的包到指定文件夹。 pip list #查看安装的包 pip freeze requirements.txt 将已经通过pip安装的包的名称记录到 requirements.txt文件中 创建存放安装包的目录:mkdir /packs pip install --download /packs pandas(存放一个pandas包) 或 pip install --download /packs -r requirements.txt(存放requirements.txt列出的所有包)2.安装指定的离线包 pip install --no-index --find-links=/packs/ pandas 或 pip install --no-index --find-links=/packs/ -r requirements.txt (也可能是 --find-link) 但是这种方法经过本人测试会出现很多问题,比如在 pip install --download /packs -r requirements.txt该操作可能会出现无法下载某些包,而且下载完成包后在新的服务器上安装可能缺少依赖关系安装不成功。 方法二:……

网友NO.408172

Python找出微信上删除你好友的人脚本写法

相信大家在微信上一定被上面的这段话刷过屏,群发消息应该算是微信上流传最广的找到删除好友的方法了。但群发消息不仅仅会把通讯录里面所有的好友骚扰一遍,而且你还得挨个删除好几百个聊天记录,回复大家的疑问和鄙视。作为一个互联网从业者,除了群发消息就不能有更高效、不打扰好友的方式么? 答案是当然有,本人的微:1613161916可以一起讨论python,还有许多Python资料可以发送。 微信在拉好友进群聊的时候,如果这个人删除了你好友的话,会提示你一下「请先发送朋友验证申请给某某,对方将你加为微信朋友后,你才能邀请其加入群聊。」有办法了,那我把微信好友拉一个大群里面,然后默默的删掉微信群不就好了么。 于是 Github 上就有一位叫 0x5e 的开发者写了这么一个 Python 脚本来代替你手动拉群和踢人。经过笔者测试,目前只能支……

网友NO.108924

python批量赋值的方法总结

python批量赋值操作实例 变量名和变量值俊发生规律的变化,利用for循环完成赋值操作。 举个例子: for i in range(1, 10): exec(t%d=i%i) print(t1)print(t2)print(t3)print(t4)print(t5)print(t6)print(t7)print(t8)print(t9) 执行结果: 123456789 利用python中的exec()函数来完成。 python实现同时给多个变量赋值的方法 本文实例讲述了python实现同时给多个变量赋值的方法。分享给大家供大家参考。具体分析如下: python中可以同时给多个变量赋值,下面列举了三种方法 # Assign values directlya, b = 0, 1assert a == 0assert b == 1 # Assign values from a list(r,g,b) = [Red,Green,Blue]assert r == Redassert g == Greenassert b == Blue # Assign values from a tuple(x,y) = (1,2)assert x == 1assert y == 2 希望本文所述对大家的Python程序设计有所帮助。 python赋值操作方法分享 一、序列赋值: x,y,z = 1,2,3我们可以看作:x = 1,y = 2,z = 3 二、链接赋值: x = y = 1p……

<
1
>

Copyright 2018-2020 www.xz577.com 码农之家

版权投诉 / 书籍推广 / 赞助:520161757@qq.com