Python 使类在init上导入其他类
我有以下文件夹结构:Python 使类在init上导入其他类,python,oop,import,Python,Oop,Import,我有以下文件夹结构: pkg1 \ | |\ | |__ subpkg1 __ main_class.py | |__ subpkg2 __ mixin_class.py | \ ... main_class.py包含main类定义,而mixin_class.py包含我需要的具有有趣功能的MixinClass。该功能使基于MainClass的对象可以刮取其目录,向下搜索,找到名称与给定正则表达式模式匹配的所有模块,然后实
pkg1 \
|
|\
| |__ subpkg1 __ main_class.py
| |__ subpkg2 __ mixin_class.py
|
\ ...
main_class.py包含main类定义,而mixin_class.py包含我需要的具有有趣功能的MixinClass。该功能使基于MainClass的对象可以刮取其目录,向下搜索,找到名称与给定正则表达式模式匹配的所有模块,然后实例化它们并将它们放入MainClass的列表中
现在,我需要调整mixin_class.py中的逻辑,该逻辑导入找到的模块并从中实例化类,以便在基于MainClass的对象不在包pkg1中时使其能够运行
|
some_dir \
| |__ class_implementing_main_class.py
| |__
| \ sub_dir \
| |__ class_for_import_1.py
| |__ class_for_import_1.py
|
|
pkg1 \
| |
| |\
| | |__ subpkg1 __ main_class.py
| | |__ subpkg2 __ mixin_class.py
| |
| \ ...
我一直在尝试使用相对导入,但我感觉在执行MixinClass逻辑时,导入是相对于pkg1-subpkg2中该MixinClass的路径的:
class MixinClass:
_FOLDERS_TO_AVOID_REGEX = r"__\w+__"
def __init__(self, small_step_regex):
self.small_step_regex = small_step_regex
def _find_and_import_objects(self, from_dir, into_list):
# pdb.set_trace()
module_paths = self.scan_for_module_paths(from_dir)
if len(module_paths):
for module in module_paths:
self._import_objects(module, into_list)
return True
def scan_for_module_paths(self, dir_path):
modules = []
for root, dirs, files in os.walk(dir_path):
for file_name in files:
if re.match(self.small_step_regex, file_name):
relative_file_path = Path(os.path.join(root, file_name)).relative_to(dir_path)
if not re.search(self._FOLDERS_TO_AVOID_REGEX, str(relative_file_path)):
modules.append(relative_file_path)
return modules
def _import_objects(self, from_module, into_list):
pdb.set_trace()
path_parts=Path(from_module).parts
module_name = ".{}".format(path_parts[-1].split(".")[0])
package_path = ".{}".format(".".join(path_parts[:-1]))
try:
# pdb.set_trace()
module = importlib.import_module(module_name, package_path)
for mem_name, obj in inspect.getmembers(module):
if inspect.isclass(obj) and inspect.getmodule(obj) is module:
into_list.append(obj())
except ImportError:
print("Failed import of module {} from package {}".format(module_name, package_path))
当从MainClass调用时,方法_find_和_import_objects()是此Mixinclass逻辑的入口点
关于如何调整此逻辑以使importlib.import_module()查看目录本地到from_dir参数传递到方法_find_和_import_objects(),有什么想法吗