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

如何通过自定义StrEnum基类实现auto()自动生成包含类名的枚举值

如何通过自定义StrEnum基类实现auto()自动生成包含类名的枚举值

我完全get到你的需求了——你希望所有继承自同一个基类的枚举,在使用auto()生成值的时候,能自动把枚举类的名称拼到值的前面,而且不用在每个枚举类里重复定义生成逻辑。其实你的现有代码框架已经很接近目标了,只需要微调元类和基类的结构,就能实现你想要的效果!

修改后的完整代码

from enum import EnumMeta, StrEnum, auto, unique
from dataclasses import dataclass

class ColumnEnumMeta(EnumMeta):
    def _generate_next_value_(cls, name, start, count, last_values):
        # 统一处理生成规则:枚举类名 + 分隔符 + 枚举成员名大写
        return f"{cls.__name__}____{name.upper()}"

@unique
class ColumnEnum(StrEnum, metaclass=ColumnEnumMeta):
    def __repr__(self) -> str:
        return self.value

# 子类直接继承ColumnEnum,无需重复编写生成逻辑
@unique
class UNIT(ColumnEnum):
    METER = auto()
    SECOND = auto()
    
@unique
class SOMETHING_ELSE(ColumnEnum):
    FOO = auto()
    BAR = auto()

@dataclass(frozen=True)
class COLUMN:
    UNIT = UNIT
    SOMETHING_ELSE = SOMETHING_ELSE

# 测试输出
print(COLUMN.UNIT.SECOND)  # 输出: UNIT____SECOND
print(COLUMN.SOMETHING_ELSE.FOO)  # 输出: SOMETHING_ELSE____FOO

关键逻辑说明

  1. 元类统一管控生成规则:
    你定义的ColumnEnumMeta元类里的_generate_next_value_方法已经实现了核心逻辑——通过cls.__name__获取当前枚举类的名称,再和枚举成员的大写名称拼接。由于这个元类绑定到了ColumnEnum基类上,所有继承自ColumnEnum的枚举类都会自动套用这个规则,完全不用重复编写生成逻辑。

  2. 基类简化子类定义:
    ColumnEnum作为所有业务枚举的统一基类,只需继承StrEnum并指定ColumnEnumMeta为元类,再统一实现__repr__方法。子类仅需继承ColumnEnum,然后定义枚举成员并使用auto()即可,写法非常简洁。

  3. COLUMN类统一组织枚举:
    你原本的COLUMN数据类用法完全保留,依然可以通过COLUMN.xxx.yyy的方式清晰访问枚举值,结构规整。

灵活调整小技巧

如果之后你想修改分隔符(比如把____改成__或者-),只需要修改ColumnEnumMeta里的格式字符串即可,所有继承自ColumnEnum的枚举都会自动生效,无需逐个修改子类。

备注:内容来源于stack exchange,提问作者Thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:50:26