如何更高效地在Python中根据名称初始化Adapter类?
优化适配器实例化的简洁方案
方案一:使用映射字典(推荐)
将适配器名称与对应类的关系用字典集中管理,彻底消除冗余的if判断,代码更简洁且易维护:
from adapters.gofirst_adapter import GoFirstAdapter from adapters.spicejet_adapter import SpiceJetAdapter from adapters.airasia_adapter import AirAsiaAdapter # 定义适配器名称到类的映射关系 ADAPTER_MAP = { 'goFirst': GoFirstAdapter, 'spiceJet': SpiceJetAdapter, 'airAsia': AirAsiaAdapter } # 你提到的适配器名称列表,可直接从映射字典中获取,确保同步 adapters = list(ADAPTER_MAP.keys()) class Adapter(): def __init__(self, adapter_name): # 从映射中取出对应类并实例化 adapter_class = ADAPTER_MAP.get(adapter_name) if not adapter_class: raise ValueError(f"不支持的适配器名称: {adapter_name}") self.adapter = adapter_class()
优势:新增适配器时,只需在ADAPTER_MAP中添加一行键值对,无需修改__init__方法的逻辑,同时自带输入合法性校验,避免无效名称导致的错误。
方案二:动态导入适配大量场景
如果适配器数量较多,不想手动逐个导入类,可以用importlib实现动态导入,进一步简化代码:
import importlib # 定义适配器名称到模块路径、类名的映射 ADAPTER_SPEC_MAP = { 'goFirst': ('adapters.gofirst_adapter', 'GoFirstAdapter'), 'spiceJet': ('adapters.spicejet_adapter', 'SpiceJetAdapter'), 'airAsia': ('adapters.airasia_adapter', 'AirAsiaAdapter') } adapters = list(ADAPTER_SPEC_MAP.keys()) class Adapter(): def __init__(self, adapter_name): spec = ADAPTER_SPEC_MAP.get(adapter_name) if not spec: raise ValueError(f"不支持的适配器名称: {adapter_name}") module_name, class_name = spec # 动态导入模块并获取目标类 module = importlib.import_module(module_name) adapter_class = getattr(module, class_name) self.adapter = adapter_class()
优势:无需提前导入所有适配器类,按需加载,尤其适合适配器数量多或需要动态扩展的场景,维护成本更低。
内容的提问来源于stack exchange,提问作者Daniel Avigdor
相关产品推荐
相关产品推荐

