是的,有可能在一个 Python 实例中完成此操作。可以动态加载单个 python 脚本,如下所示:
- 仅使用
importlib.import_module()动态加载模块
- 使用
getattr() 动态加载模块和类。
备选方案 1
如果您只想动态加载模块,请使用importlib.import_module()。假设您在子文件夹 protocols 中有以下协议:
protocols/protocol_1.py 包含以下类:
class Protocol():
# some protocol specific code
protocols/protocol_2.py 包含以下类:
class Protocol():
# some protocol specific code
首先,我们使用将从 Web API 返回的协议名称定义动态变量:
module = 'protocols.protocol_1'
然后我们导入 importlib 并动态加载模块。协议类在两个文件中具有相同的类名,但协议特定代码。之后,我们用动态加载的 Protocol 实例化 api_protocol:
import importlib
Protocol = importlib.import_module(module).Protocol
api_protocol = Protocol()
备选方案 2
如果您还想动态加载类,请使用 getattr。假设您在子文件夹 protocols 中有以下协议:
protocols/protocol_1.py 包含以下类:
class Protocol_1():
# some protocol specific code
protocols/protocol_2.py 包含以下类:
class Protocol_2():
# some protocol specific code
首先,我们使用将从 Web API 返回的协议名称来定义动态变量:
module = 'protocols.protocol_1'
class_name = 'Protocol_1'
然后我们调用__import__ 函数来动态加载动态模块的类。之后我们可以使用getattr 创建新类,并使用动态加载的协议实例化 api_protocol:
mod = __import__(module, fromlist=[class_name])
Protocol = getattr(mod, class_name)
api_protocol = Protocol()