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

如何构建Python面向对象代码实现多API类的标准化与并发兼容

问题背景

我开发了一个需求复杂的应用,现有架构虽能运行,但随规模扩展已变得臃肿,且存在大量重复代码。项目简化后数据流为:DataSenders -------> MyApp -------> DataReceivers。

需为A、B、C、D四个在线API编写wrapper classes,以标准化与MyApp交互的数据收发格式。核心难点在于这些API并非单一角色:A、B、C为发送端,B、C、D为接收端,且需支持同时并发收发(如B的收、发分别由不同线程处理)。

目前有三种架构方案:

  • 方案1:编写通用的DataSender和DataReceiver类,通过实例化参数区分A、B、C、D,强制统一方法名与返回格式,但会导致类代码冗长,充斥大量if-else分支。
  • 方案2:为DataSender和DataReceiver编写父类,让A、B、C、D继承并按需重写API特定方法。这是当前采用的方案,但Python继承(尤其是多继承)易出现问题。
  • 方案3:为每个API单独编写wrapper class,虽代码简洁,但需手动强制方法与输出格式,易混乱。

现寻求适合大规模扩展的方案,也欢迎其他新思路。项目基于Python开发,部署在AWS ECS。


推荐方案与思路

1. 接口抽象+组合模式替代继承

用Python抽象基类(ABC)定义两个抽象接口,明确收发必须实现的方法规范,再为每个API编写独立实现类,多角色API(如B)可同时实现两个接口,完全避开多继承的复杂问题。

示例代码:

from abc import ABC, abstractmethod

class DataSenderProtocol(ABC):
    @abstractmethod
    def send_data(self, data: dict) -> dict:
        """发送数据,返回MyApp标准化响应"""
        pass

class DataReceiverProtocol(ABC):
    @abstractmethod
    def receive_data(self) -> dict:
        """接收数据,返回MyApp标准化格式"""
        pass

# API B的实现,同时支持收发
class APIBWrapper(DataSenderProtocol, DataReceiverProtocol):
    def send_data(self, data: dict) -> dict:
        # 转换数据为B的发送格式
        api_data = self._transform_to_b_send_format(data)
        # 调用B的发送API
        raw_response = self._call_b_send_api(api_data)
        # 转换响应为MyApp标准化格式
        return self._transform_from_b_response(raw_response)
    
    def receive_data(self) -> dict:
        # 调用B的接收API
        raw_data = self._call_b_receive_api()
        # 转换数据为MyApp标准化格式
        return self._transform_from_b_receive_data(raw_data)
    
    # 私有方法处理API特定逻辑
    def _transform_to_b_send_format(self, data):
        # 实现格式转换逻辑
        pass
    
    def _call_b_send_api(self, data):
        # 实现API调用逻辑
        pass

这种模式的优势:

  • 接口只定义规范,实现类专注自身逻辑,职责单一
  • 抽象基类强制实现要求,避免格式混乱
  • 代码清晰,新增API只需添加对应实现类,扩展性强

2. 工厂模式统一管理实例

为方便MyApp调用,编写工厂类统一获取不同API的收发实例,MyApp无需关心具体实现细节:

class APIWrapperFactory:
    @staticmethod
    def get_sender(api_type: str) -> DataSenderProtocol:
        sender_map = {
            "A": APIAWrapper(),
            "B": APIBWrapper(),
            "C": APICWrapper()
        }
        return sender_map.get(api_type, ValueError(f"不支持的发送端API: {api_type}"))
    
    @staticmethod
    def get_receiver(api_type: str) -> DataReceiverProtocol:
        receiver_map = {
            "B": APIBWrapper(),
            "C": APICWrapper(),
            "D": APIDWrapper()
        }
        return receiver_map.get(api_type, ValueError(f"不支持的接收端API: {api_type}"))

后续新增API,只需添加实现类并更新工厂中的映射,对原有代码无侵入。

3. 并发收发处理

对于需要并发收发的API(如B),每个wrapper实例独立,可直接在不同线程中调用对应方法。只需保证wrapper内部方法线程安全:

  • 若API有并发限制,可在wrapper中添加线程锁
  • 调用外部API时使用连接池,避免频繁创建连接

其他优化建议

  • 提取通用逻辑到工具类:将不同API共有的格式转换、请求处理等逻辑封装成工具函数,减少重复代码
  • 配置化管理API参数:将API地址、密钥等参数放在AWS ECS环境变量或配置文件中,wrapper动态读取,便于部署调整
  • 单元测试覆盖:为每个wrapper编写单元测试,验证格式转换和API调用逻辑,大规模扩展时保障质量

内容的提问来源于stack exchange,提问作者Maguire Papay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:20:26