You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更高效地在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 02:25:46