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

如何为Python的enum.StrEnum枚举成员添加属性?

实现带自定义属性的StrEnum枚举类

要给StrEnum的枚举成员添加自定义属性,你可以通过重写枚举类的__new__方法来处理元组形式的成员值,将元组中的第一个元素作为枚举的字符串值,第二个元素的字典作为成员的属性。具体实现如下:

自定义带属性的StrEnum基类

import enum

class AttributedStrEnum(enum.StrEnum):
    def __new__(cls, value, attrs=None):
        # 处理直接传入字符串的情况
        if isinstance(value, str):
            member = str.__new__(cls, value)
            member._value_ = value
            return member
        # 处理传入元组(字符串+属性字典)的情况
        elif isinstance(value, tuple):
            str_value, attrs = value if len(value) == 2 else (value[0], None)
            member = str.__new__(cls, str_value)
            member._value_ = str_value
            # 为成员添加属性
            if attrs is not None:
                for attr_name, attr_val in attrs.items():
                    setattr(member, attr_name, attr_val)
            return member
        else:
            raise TypeError(f"{cls.__name__}仅支持字符串或(字符串, 属性字典)格式的成员值")

使用示例

class Fruit(AttributedStrEnum):
    APPLE = ("Apple", {"color": "red"})
    BANANA = ("Banana", {"color": "yellow"})
    ORANGE = "Orange"  # 支持直接传入字符串,不带额外属性

测试验证

>>> str(Fruit.APPLE)
'Apple'
>>> Fruit.APPLE.color
'red'
>>> Fruit.APPLE.value
'Apple'
>>> str(Fruit.ORANGE)
'Orange'

原理说明

StrEnum的成员本质是str的子类,重写__new__方法后,我们可以拦截成员的创建过程:

  1. 解析传入的元组,提取字符串值作为枚举成员的_value_(保证str()调用返回正确结果)
  2. 将属性字典中的键值对逐个绑定到枚举成员实例上,实现直接访问属性的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:45:31