如何构建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
相关产品推荐
相关产品推荐

