如何通过自定义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
关键逻辑说明
元类统一管控生成规则:
你定义的ColumnEnumMeta元类里的_generate_next_value_方法已经实现了核心逻辑——通过cls.__name__获取当前枚举类的名称,再和枚举成员的大写名称拼接。由于这个元类绑定到了ColumnEnum基类上,所有继承自ColumnEnum的枚举类都会自动套用这个规则,完全不用重复编写生成逻辑。基类简化子类定义:
ColumnEnum作为所有业务枚举的统一基类,只需继承StrEnum并指定ColumnEnumMeta为元类,再统一实现__repr__方法。子类仅需继承ColumnEnum,然后定义枚举成员并使用auto()即可,写法非常简洁。COLUMN类统一组织枚举:
你原本的COLUMN数据类用法完全保留,依然可以通过COLUMN.xxx.yyy的方式清晰访问枚举值,结构规整。
灵活调整小技巧
如果之后你想修改分隔符(比如把____改成__或者-),只需要修改ColumnEnumMeta里的格式字符串即可,所有继承自ColumnEnum的枚举都会自动生效,无需逐个修改子类。
备注:内容来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

