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

为多具体实现定义API:基类函数参数设计方案咨询

配置隔离与API统一的设计问题

我需要实现多个共享同一API的具体类,这些类基础功能一致,但支持包含共享配置项的不同类型配置,同时要尽可能隔离各具体类的实现。为此我设计了抽象基类AbstractA来定义API,但不确定如何定义函数参数,目前提出两种方案:

方案1:包含所有可能配置项的通用配置类

优点

  • 所有实现拥有统一的API

缺点

  • API会暗示支持某些实际不支持的配置(未来可能支持),需通过文档说明或在误用时报错
  • 新增配置项时,现有其他具体类无法适配该新项

代码示例:

from dataclasses import dataclass
from typing import Optional
from abc import ABC, abstractmethod

@dataclass
class CommonCfg:
    cfg_1: Optional[int] = None
    cfg_2: Optional[int] = None
    cfg_3: Optional[int] = None

class AbstractA(ABC):
    @abstractmethod
    def func_z(self, cfg: CommonCfg):
        pass

class B(AbstractA):
    def func_z(self, cfg: CommonCfg):
        # 不使用`cfg_3`
        pass

class C(AbstractA):
    def func_z(self, cfg: CommonCfg):
        # 不使用`cfg_2`
        pass

方案2:基类使用泛型签名

基类基于泛型定义参数类型,子类ClassB和ClassC的func_z分别接收各自的专属配置类CfgB和CfgC。

代码示例:

from abc import ABC
from typing import Generic, TypeVar, Optional

CfgType = TypeVar('CfgType')

class AbstractA(ABC, Generic[CfgType]):
    @abstractmethod
    def func_z(self, cfg: CfgType):
        pass

# 子类专属配置与实现
class CfgB:
    cfg_1: Optional[int] = None
    cfg_2: Optional[int] = None

class ClassB(AbstractA[CfgB]):
    def func_z(self, cfg: CfgB):
        pass

class CfgC:
    cfg_1: Optional[int] = None
    cfg_3: Optional[int] = None

class ClassC(AbstractA[CfgC]):
    def func_z(self, cfg: CfgC):
        pass

理想场景

仅涉及通用配置时,能无缝替换不同具体实现的对象,示例如下:

b = ClassB()
c = ClassC()

# 仅包含共享配置项的通用配置类
class CommonCfg:
    cfg_1: Optional[int] = None

cfg = CommonCfg()
b.func_z(cfg)
# 期望无负担替换为:
# c.func_z(cfg)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:56:12