使用注册机制动态引入模块
原因:希望在配置文件中写入需要用的模型(或者loss等),动态实例化,不需要更改main文件
我们假设需要动态实例化的是一个类
我们有如下的文件树
|- test_modules
|- __init__.py
|- a.py
|- b.py
|- register_modules.py
|- main.py
在main文件中,动态初始化不同的模型(这里指a.py和b.py中的类)
现在我们需要动态地实例化其中的一个类
registery 注册
我们在register_modules.py文件中,使用下面的装饰器
它可以将类自动注册到字典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文件可以这样写
然后在main文件中直接调用init_cls
即可