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

如何基于Enum类型对Python类方法实现typing.overload重载

实现方案说明

首先明确核心前提:Python 的 typing.overload 仅用于静态类型检查提示,不会在运行时自动根据参数分发执行不同逻辑,你需要自行编写实际的执行分支。

1. 基础实现(无需修改枚举 __new__ 方法)

你不需要为枚举类自定义 __new__ 方法,仅需修正类型注解写法,补充实际执行逻辑即可:

  • 枚举成员不能只用:做变量注解,必须用=赋值才能生成有效枚举实例
  • 要实现按枚举值重载,需要用 Literal[] 包裹具体枚举实例,静态类型检查器才能识别对应重载分支

完整可运行示例代码

import enum
from typing import overload, Literal, Optional, List

class GetPortType(enum.Enum):
    DIFF_1 = "Diff1"
    DIFF_2 = "Diff2"
    SAME_1 = "Same1"
    SAME_2 = "Same2"

class Port:
    @overload
    def get_port_on_type(self, type: Literal[GetPortType.DIFF_1], num: int, skip: Optional[List] = None) -> List:
        ...

    @overload
    def get_port_on_type(self, type: Literal[GetPortType.DIFF_2], num: int, skip: Optional[List] = None) -> List:
        ...

    @overload
    def get_port_on_type(self, type: Literal[GetPortType.SAME_1], num: int, skip: Optional[List] = None) -> List:
        ...

    @overload
    def get_port_on_type(self, type: Literal[GetPortType.SAME_2], num: int, skip: Optional[List] = None) -> List:
        ...

    # 实际运行时执行的实现方法
    def get_port_on_type(self, type: GetPortType, num: int, skip: Optional[List] = None) -> List:
        if type == GetPortType.DIFF_1:
            # 对应 DIFF_1 的业务逻辑
            return []
        elif type == GetPortType.DIFF_2:
            # 对应 DIFF_2 的业务逻辑
            return []
        elif type == GetPortType.SAME_1:
            # 对应 SAME_1 的业务逻辑
            return []
        elif type == GetPortType.SAME_2:
            # 对应 SAME_2 的业务逻辑
            return []
        raise ValueError(f"不支持的枚举值 {type}")

2. 你提到的元类方案不可行

给枚举元类加动态property的方案没有实际价值:

  • 静态类型检查器(mypy、Pylance等)不会解析运行时动态生成的属性类型,你写的GetPortType.SAME_2.type注解对静态检查来说是无意义的,无法识别对应重载分支
  • 额外增加了代码复杂度,完全可以用上面的Literal方案实现需求,不需要做元类定制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:54:02