首页 > 编程语言 >python 动态导入模块并结合反射,动态获取类、方法(反射太好用)

python 动态导入模块并结合反射,动态获取类、方法(反射太好用)

时间:2022-08-19 16:38:31浏览次数:99  
标签:反射 name python 模块 module 导入 file path 动态

背景:

 关键字驱动框架,不同的关键字方法分别定义在不同的类,真正执行关键字方法又在不同的类(简称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

标签:反射,name,python,模块,module,导入,file,path,动态
From: https://www.cnblogs.com/cuitang/p/16602333.html

相关文章

  • 小恐龙快跑,不要被逮到拉~ python制作小恐龙游戏
    前言嗨喽~大家好呀,这里是魔王呐!  这个小恐龙熟悉叭,相信你在摸鱼得时候玩过它~这是谷歌流量器中很有名的彩蛋:当你网络出现问题时,就会出现一个“小恐龙游戏”。......
  • Python基础之reduce函数
    哈喽大家好,今天说一下reduce函数的使用方法,以及与for循环的对比。reduce函数原本在python2中也是个内置函数,不过在python3中被移到functools模块中。reduce函数先从......
  • python JSON.parse
    一、JSON的解析方法有两种:eval()和JSON.parse()varjsonstr='{"str1":"Hello,","str2":"world!"}';varevalJson=eval('('+jsonstr+')');varjsonParseJson=JSON.parse......
  • python基础-函数式编程
    概念:电脑运算视作数学上的函数计算高阶函数:map,reduce,filter无副作用,相同的参数调用时钟产生同样的结果闭包Closure例子:defcache(func):store={}#外部自由......
  • python将代码打包成whl或者压缩文件使用pip安装
    需要条件:安装setuptools,wheel创建目录helloworld—init.py—代码1.py—代码2.pysetup.py编辑__init__.pyfromhelloworldimport代码1,代码2在helloworld同级下......
  • python生成随机码-转至武沛齐老师
      Python生成随机验证码,需要使用PIL模块.安装:1pip3installpillow基本使用1.创建图片123456789from PIL import I......
  • Python中,函数的返回值
    deffun(num):odd=[]#存奇数even=[]#存偶数foriinnum:ifi%2:odd.append(i)else:even.append(i)re......
  • python激活
    Pycharm又过期了怎么办? 方法一:(亲测可用)1、打开网址: lookdiv.com 2、在输入框输入钥匙:lookdiv.com3、点击“获取激活码”按钮,获取激活码 4.激活后可以使用几......
  • python-zip()函数-zip*函数-压缩-解压缩
    python-zip()函数-压缩-解压缩zip()函数:将多个序列(列表、元组、字典、集合、字符串以及range()构成的列表)按一定规则重新组成一组元组。常与list()函数搭配使用,list......
  • python中的@的使用
    在python中,@是一个装饰器,针对某个函数,起调用传参的作用。具体怎么用的可以参考如下代码:defA(fn):print("a")fn()defB():print("b")@AdefC():......