曹子晗

个人博客

欢迎来到我的个人博客


使用注册机制动态引入模块

目录

使用注册机制动态引入模块

原因:希望在配置文件中写入需要用的模型(或者loss等),动态实例化,不需要更改main文件

我们假设需要动态实例化的是一个类

我们有如下的文件树

|- test_modules
	|- __init__.py
	|- a.py
	|- b.py
	|- register_modules.py
|- main.py

在main文件中,动态初始化不同的模型(这里指a.py和b.py中的类)

code

code

现在我们需要动态地实例化其中的一个类

registery 注册

我们在register_modules.py文件中,使用下面的装饰器

code

它可以将类自动注册到字典MODULES中,我们只需要在实例化时,从MODULES中寻找相同的key即可。

动态实例化

在实现动态实例化的时候,就需要MODULES中有相应的key和value,这就意味着需要在__init__.py中import A和B

简单来说,可以直接from .a import A这样,但是这样每次写一个类,都需要在__init__.py文件中import一下

实际上,我们可以使用importlib来导入,我们假设除了__init__.py和register_modules.py文件之外,都是我们需要的模型文件

我们直接使用importlib.import_module来导入即可

在__init__.py文件可以这样写

code

然后在main文件中直接调用init_cls即可