python 动态导入模块并结合反射,动态获取类、方法(反射太好用),动态执行方法
背景:
关键字驱动框架,不同的关键字方法分别定义在不同的类,真正执行关键字方法又在不同的类(简称A),这样就需要在执行前,要在文件A下import要使用的模块,如果有很多页面操作或很多模块时,就需要每次都要import,比较麻烦;如果执行时,没有import相应的模块时,会提示xxx not define
动态导入模块结合反射,实现动态调用方法
1、 通过判断当前文件是否包含指定模块,如果不包含,动态导入,声明变量接收动态导入的结果module
2、 反射,结合返回的module,获取指定的类
3、 获取到指定的类后,进行实例化
4、 实例化成功,再次通过反射,获取到指定类的下的方法
5、 获取到方法后,执行,完成

if file_module not in sys.modules:
module = importlib.import_module(file_module) # 动态导入
module_class = getattr(module, class_name) # 反射获取模块下的类
obj = module_class() # 实例化类
else:
obj = globals()[class_name]() # 实例化类 # == 通过反射: 通过已实例化的类,获取到真正要执行的方法 ===
try:
run_fun = getattr(obj, key_fun)
logger.info(f"== 执行步骤:{step_name} ==")
if args:
# 可以传入多个参数
run_fun(*args)
else:
run_fun()
except Exception as e:
logger.exception(f"将字符串: {key_obj},转化为类失败,请检查: {e}")
动态导入,传入的是package.文件,就做了传入当前文件名,获取文件路径
如文件结构
utils
A.py
run
main.py
要在main.py,动态导入A模块,传入的module_name = utils.A,module = importlib.import_module(utils.A)
def search_file_path(self, file_name, root_path, suffix="py", ):
'''
输入文件名,查找文件,并返回当前文件的绝对路径
:param file_name: 文件名,默认不包含后缀
:param suffix: 文件后缀,默认为py
:param root_path: 查找的文件路径
:return:
'''
new_file_name = file_name + "." + suffix
for root, dirs, files in os.walk(root_path):
for name in files:
if name == new_file_name:
res_path = os.path.join(root, name)
return res_path
获取文件路径后,获取其父类文件名
def path_get_parent_name(self, path):
path = Path(path)
return path.parent.name
模块名就由父类文件名 + 文件名,拼接组成,传入到import_module(),进行导入
module = file_parent + "." + file_name
参考:https://blog.csdn.net/weixin_43106092/article/details/118099874
python 动态导入模块并结合反射,动态获取类、方法(反射太好用),动态执行方法的更多相关文章
- python 反射 动态导入模块 类attr属性
1.反射 hasattr getattr delattr setattr 优点:事先定义好接口,接口只有在被完成后才能真正执行,这实现了即插即用,这其实是一种“后期绑定”,即先定义好接口, 然后是再去 ...
- Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
实现接口类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...
- Python 实现抽象类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
实现抽象类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...
- python学习之-- 动态导入模块
python 动态导入模块方法1: __import__ 说明: 1. 函数功能用于动态的导入模块,主要用于反射或者延迟加载模块. 2. __import__(module)相当于import mod ...
- 封装,封装的原理,Property ,setter ,deleter,多态,内置函数 ,__str__ , __del__,反射,动态导入模块
1,封装 ## 什么是封装 what 对外隐藏内部的属性,以及实现细节,并给外部提供使用的接口 学习封装的目的:就是为了能够限制外界对内部数据的方法 注意 :封装有隐藏的意思,但不是单纯的隐藏 pyt ...
- Python 动态导入模块
动态导入模块 目录结构: zhangsandeMacBook-Air:1110 zhangsan$ tree . . ├── lib │ └── aa.py ├── test1.py lib目录下 ...
- Python importlib(动态导入模块)
使用 Python importlib(动态导入模块) 可以将字符串型的模块名导入 示例: import importlib module = 'module name' # 字符串型模块名 test ...
- python动态导入模块——importlib
当在写代码时,我们希望能够根据传入的选项设置,如args.model来确定要导入使用的是哪个model.py文件,而不是一股脑地导入 这种时候就需要用上python的动态导入模块 比如此时文件结构为: ...
- python_反射:动态导入模块
官方推荐方法: test_mod.py def hi(): print('Hi') test.py import importlib q = importlib.import_module('test ...
- python中schedule模块的简单使用 || importlib.import_module动态导入模块
1 import schedule 2 import time 3 4 def start(): #定义一个函数 5 print("****") 6 7 8 if __name__ ...
随机推荐
- [FAQ] FinalCutPro 添加转场提示“片段边缘之外没有足够的额外媒体可用来创建转场”
可以把前镜头素材的结尾和后镜头素材的开始减去一部分即可添加转场了. 怎么剪?时间线中有个播放线,快捷键 i 表示选中开始点,快捷键 o 表示选中结束点,使用 delete 键删除选取的部分即可. &g ...
- dotnet C# 如何使用 MemoryFailPoint 检查是否有足够的内存资源来执行操作
在 dotnet 里面的 MemoryFailPoint 可用来测试当前进程是否还能分配申请给定大小的内存空间,这个是一个高级编程的类型,大部分情况下都不需要用到.本文内容由 New Bing 编写, ...
- dotnet C# 基于 INotifyPropertyChanged 实现一个 CLR 属性绑定辅助类
习惯了 WPF 或 UWP 等的依赖属性的绑定机制之后,我在写 CLR 属性时,有时也期望将两个 CLR 属性给绑定到一起.在 dotnet 里,提供了 System.ComponentModel.I ...
- 2018-5-28-WPF-Process.Start-出现-Win32Exception-异常
title author date CreateTime categories WPF Process.Start 出现 Win32Exception 异常 lindexi 2018-05-28 10 ...
- vue项目中element-ui等UI组件自定义样式不生效的解决
引 在使用element-ui的时候虽然默认的样式已经能够满足很多的需求了,但是有总是有时候要加上些自定义的需求.不过,有的时候样式写上去了,按理说应该是没错的,但却是不生效呢. 其实在vue项目中使 ...
- Apache Pulsar 桌面端图形化管理工具
Apache Pulsar 桌面端图形化管理工具 Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息.存储.轻量化函数式计算为一体,采用计算与存储 ...
- 4.k8s-配置网络策略 NetworkPolicy
一.基本了解 官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/基本了解: 1.网 ...
- 自定义的基于System.Net.Http.HttpClient的WebClient,可以作为微信支付宝的发起请求时的基础请求类
个人编写的,自己用于自己的微信api的请求的实现当中,源码公开,大家可以查看反编译源码.以下是使用方法: 第一步 搜索和安装zmjtool 第二步 发起请求 1 /**引入命名空间*/ 2 using ...
- 小程序真机报错errMsg: “hideLoading:fail:toast can‘t be found“ ?
showLoading 和 showToast 同时只能显示一个: showLoading 应与hideLoading 配对使用: 把请求接口统一封装,开始请求接口时showLoading,请求接口后 ...
- 网络安全—PKI公钥基础设施
文章目录 前提知识 散列函数 非对称加密 数字签名 PKI 受信任的人 RA注册 CA颁发 IKE数字签名认证(交换证书) 密钥管理 前提知识 散列函数 散列也可以叫哈希函数,MD5.SHA-1.SH ...