Python 策略模式:动态导入类文件

2 投票
1 回答
1110 浏览
提问于 2025-04-16 20:19

我正在尝试创建一个软件包,用来修复我数据库中各种数据不一致的问题。我的设计包含两个类——Problem(问题)和 Fix(修复)。

这些问题是以 SQL 查询的形式存储在 .cfg 文件中(比如 problem_001.cfg),而修复程序则是存储在 Python 文件中(比如 fix_001.py)。查询配置文件里会提到对应的 Python 文件名。每个修复程序都有一个单独的 Fix 类,这个类是从一个基础类 BaseFix 继承而来的。

`-- problems
    |-- problem_100.cfg
    |-- problem_200.cfg
    |-- problem_300.cfg
    `-- ...
`-- fixer
    |-- __init__.py
    |   |-- fixers
    |   |   |-- fix_100.py
    |   |   |-- fix_200.py
    |   |   |-- fix_300.py
    |   |   |-- ...
    |   `-- ...
    `-- ...

我想要以一种干净的方式来实例化 Problem 文件,并给它们提供 Fix 对象。有没有办法做到这一点,而不需要把所有的修复程序放在同一个文件里呢?

更新:

这是最终的代码,成功运行了(感谢 @Space_C0wb0y):

    fixer_name='fix_100'
    self.fixer=__import__('fixer.fixers', globals(), locals(), 
                 [fixer_name]).__dict__[fixer_name].Fix() 

1 个回答

4

你可以使用内置的 __import__ 函数动态导入模块,这个函数需要一个字符串作为参数,也就是模块的名字(详细信息可以查看 这里)。不过,这些模块必须在 模块搜索路径 中。

撰写回答