首页 > 编程语言 >python动态加载(三)

python动态加载(三)

时间:2024-03-31 21:46:42浏览次数:12  
标签:__ name lib python self module folder 动态 加载

class TestInstance:
    def __init__(self):
        # 初始化库字典,存放找到的库
        self.lib = Proxy()  # 使用一个代理对象来模拟层级结构

        # 加载库,这里只是模拟,实际中需要导入库模块
        self._load_libs()

    def _load_libs(self):
        # 加载projectlib
        self._load_lib_folder()
        # 加载commonlib,如果projectlib中没有找到对应的库,这里会作为后备
        self._load_lib_folder()

    def _load_lib_folder(self, folder_name):
        import os
        import importlib

        # 获取库文件夹的绝对路径
        lib_folder_path = os.path.join(os.path.dirname(__file__), folder_name)

        # 遍历库文件夹中的所有文件
        for filename in os.listdir(lib_folder_path):
            if filename.endswith('.py') and filename != '__init__.py':
                # 移除文件扩展名,得到库名
                lib_module_name = filename[:-3]
                # 使用绝对导入加载库模块
                module = importlib.import_module(f'{folder_name}.{lib_module_name}')
                # 将库模块添加到lib代理对象的层级结构中
                setattr(self.lib, lib_module_name, module)

    # def _load_lib_folder(self, folder_name):
    #     import os
    #     import sys
    #     import importlib
    #
    #     # 获取库文件夹的绝对路径
    #     lib_folder_path = os.path.join(os.path.dirname(__file__), folder_name)
    #
    #     # 遍历库文件夹中的所有文件
    #     for filename in os.listdir(lib_folder_path):
    #         if filename.endswith('.py') and filename != '__init__.py':
    #             # 移除文件扩展名,得到库名
    #             lib_module_name = filename[:-3]
    #             # 导入库模块
    #             module = importlib.import_module(f'.{folder_name}.{lib_module_name}', __name__)
    #             # 将库模块添加到lib代理对象的层级结构中
    #             setattr(self.lib, lib_module_name, module)

            # 定义一个代理类,用于模拟属性访问


class Proxy:
    def __init__(self):
        self._parent = None

    def __getattr__(self, name):
        # 递归地向上查找父对象,直到找到对应的属性或达到根对象
        parent = self._parent
        while parent is not None:
            try:
                return getattr(parent, name)
            except AttributeError:
                parent = getattr(parent, '_parent', None)
        raise AttributeError(f"module '{name}' not found")

        # 其他测试实例相关的方法...


class MyTest(TestInstance):
    def test_greet(self):
        # 调用projectlib中的greet函数
        result = self.lib.libA.greet()
        print(result)  # 应该输出: Hello from projectlib's libA!


if __name__ == '__main__':
    my_test = MyTest()
    my_test.test_greet()

  

标签:__,name,lib,python,self,module,folder,动态,加载
From: https://www.cnblogs.com/shunguo/p/18107322

相关文章

  • vscode远程连接docker容器打断点调试python项目
    vscode远程连接服务器docker容器前提:本地和远程都安装docker插件。1.安装完docker插件后点击插件图标2.如果登录的账号没有docker权限的会会报权限不足,使用以下命令把用户加到docker权限组中sudogpasswd-a<当前登陆用户名>docker#从用户组中删除:sudogpasswd-d<当前......
  • 理解 Python 编程中 *args 与 **kwargs 的妙用
    文章目录一、形式参数与实际参数二、*args与**kwargs三、总结......
  • Python大数据为啥一定要用Numpy Array,靠着这份900多页的PDF面试整理
    1.内存占用更小适当地使用Numpy数组替代List,你能让你的内存占用降低20倍。对于Python原生的List列表,由于每次新增对象,都需要8个字节来引用新对象,新的对象本身占28个字节(以整数为例)。所以列表list的大小可以用以下公式计算:64+8*len(lst)+len(lst)*28字节而使......
  • python+opecv打开电脑本地相机并切换不同分辨率
    python+opecv打开电脑本地相机并切换不同分辨率一、实现业务场景:1、电脑摄像头功能要切换相机不同分辨率二、安装、前置条件1、电脑支持摄像头并驱动正常2、python安装opencv并使用国内源【豆瓣】pipinstall-ihttps://pypi.douban.com/simpleopencv-python三、......
  • 2024 python毕业设计(论文)- python毕设选题大全 - 选题指导精编版
    目录前言python毕设选题开题指导建议更多精选选题选题帮助最后前言大家好,这里是海浪学长毕设专题!大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理了计算机专......
  • Python数据分析九
    一、Python之列表操作方法remove和pop在Python中,列表还提供了其他一些常用的操作方法,例如删除指定元素和弹出(移除并返回)指定位置的元素。其中,remove()方法用于删除列表中第一个匹配的元素,而pop()方法用于弹出指定位置的元素。以下是详细的代码示例:使用remove()方法删除列表中......
  • 2.python 基本数据类型
    #python基本数据类型#python中等号用来给变量赋值counter=100#整形变量miles=1000.0#浮点型变量name="runoob"#字符串print(counter)print(miles)print(name)#python允许同时为多个变量赋值a=b=c=1print(a)print(b)print(c)#为多个对......
  • 3.python 数据类型转换
    #python数据类型转换"""python数据类型转换可以分为两种:隐式类型转换-自动完成显示类型转换-需要使用类型函数来转换"""#隐式类型转换(自动类型转换)#隐式类型转换中,python会自动将一种数据类型转换为另一种数据类型。#转换规则:低精度向高精度转换(bool->int->......
  • 1.python简介
    """python简介python版本:python-V或python--versionpython特色:1.python是一种解释性语言:这意味着开发过程中没有编译这个环节。类似于PHP和Perl2.python是交互式语言:这意味着可以在一个python提示符>>>后直接执行代码3.python是面向对象语言:这意味着python支持面向......
  • 如何利用python 把一个表格某列数据和另外一个表格某列匹配 类似Excel VLOOKUP功能
    环境:python3.8.10Excel2016Win10专业版问题描述:如何利用python把一个表格某列数据和另外一个表格某列匹配类似ExcelVLOOKUP功能先排除两表A列空白单元格,然后匹配x1表格和x2表格他们的A列,把x1表格中A列A1-A810范围对应的B列B1-B810数据,匹配填充到x2范围A1-A479,B1-B......