背景:

关键字驱动框架,不同的关键字方法分别定义在不同的类,真正执行关键字方法又在不同的类(简称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 动态导入模块并结合反射,动态获取类、方法(反射太好用),动态执行方法的更多相关文章

  1. python 反射 动态导入模块 类attr属性

    1.反射 hasattr getattr delattr setattr 优点:事先定义好接口,接口只有在被完成后才能真正执行,这实现了即插即用,这其实是一种“后期绑定”,即先定义好接口, 然后是再去 ...

  2. Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)

    实现接口类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...

  3. Python 实现抽象类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)

    实现抽象类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...

  4. python学习之-- 动态导入模块

    python 动态导入模块方法1: __import__ 说明: 1. 函数功能用于动态的导入模块,主要用于反射或者延迟加载模块. 2. __import__(module)相当于import mod ...

  5. 封装,封装的原理,Property ,setter ,deleter,多态,内置函数 ,__str__ , __del__,反射,动态导入模块

    1,封装 ## 什么是封装 what 对外隐藏内部的属性,以及实现细节,并给外部提供使用的接口 学习封装的目的:就是为了能够限制外界对内部数据的方法 注意 :封装有隐藏的意思,但不是单纯的隐藏 pyt ...

  6. Python 动态导入模块

    动态导入模块 目录结构: zhangsandeMacBook-Air:1110 zhangsan$ tree . . ├── lib │   └── aa.py ├── test1.py lib目录下 ...

  7. Python importlib(动态导入模块)

    使用 Python importlib(动态导入模块) 可以将字符串型的模块名导入 示例: import importlib module = 'module name' # 字符串型模块名 test ...

  8. python动态导入模块——importlib

    当在写代码时,我们希望能够根据传入的选项设置,如args.model来确定要导入使用的是哪个model.py文件,而不是一股脑地导入 这种时候就需要用上python的动态导入模块 比如此时文件结构为: ...

  9. python_反射:动态导入模块

    官方推荐方法: test_mod.py def hi(): print('Hi') test.py import importlib q = importlib.import_module('test ...

  10. python中schedule模块的简单使用 || importlib.import_module动态导入模块

    1 import schedule 2 import time 3 4 def start(): #定义一个函数 5 print("****") 6 7 8 if __name__ ...

随机推荐

  1. [FAQ] Goland 始终没有包代码的提示 ?

    表现:import 引入的包始终是红色的,表示没有找到引入的包. 注意,在这里开启Go Modules: 然后在 Exteneral Libraries 里看到 Go Modules 即可. Refe ...

  2. github 解决推拉代码提示 REMOTE HOST IDENTIFICATION HAS CHANGED 失败

    本文记录最近 github 推送或拉取代码时提示 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 而失败的解决方法 报错提示如下 @@@@@@@@@@ ...

  3. WPF 列表控件数据源绑定多个数据集合方法

    在 WPF 用的多的列表控件如 ListBox 或 ListView 等,本文告诉大家在这些列表控件上进行绑定多个数据集合来源的多个实现方法.如有一个显示动物列表的控件,需要绑定的数据来源是阿猫和阿狗 ...

  4. 2019-8-31-C#-简单读取文件

    title author date CreateTime categories C# 简单读取文件 lindexi 2019-08-31 16:55:58 +0800 2018-07-19 16:48 ...

  5. 2019-8-31-How-to-output-the-target-message-in-dotnet-build-command-line

    title author date CreateTime categories How to output the target message in dotnet build command lin ...

  6. C语言笔记001-用C语言编写程序

    例2-1  在屏幕上显示一个短句"Hello World!". #include <stdio.h> int main(void) { printf("hel ...

  7. 路由跳转报错:Uncaught (in promise) NavigationDuplicated {_name: "NavigationDuplicated", name: "NavigationDuplicated",...

    记录一个路由跳转的报错: 将换成

  8. Windows下绑定线程到指定的CPU核心

    在某些场景下,需要把程序绑定到指定CPU核心提高执行效率.通过微软官方文档查询到Windows提供了两个Win32函数:SetThreadAffinityMask和SetProcessAffinity ...

  9. 由初中生实现的 Windows 12 网页版!

    大家好,我是 Java陈序员. 这几天,逛 Github 的时候,看到了一个项目 win12 -- 仿 Windows12 网页版!被它实现的页面功能震撼到了,大家可以一起来感受下! 首先是登录页面. ...

  10. 【python爬虫案例】爬取微博任意搜索关键词的结果,以“唐山打人”为例

    目录 一.爬取目标 二.展示爬取结果 三.讲解代码 四.同步视频 4.1 演示视频 4.2 讲解视频 五.附:完整源码 一.爬取目标 大家好,我是马哥. 今天分享一期python爬虫案例,爬取目标是新 ...