如何为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__方法后,我们可以拦截成员的创建过程:
- 解析传入的元组,提取字符串值作为枚举成员的
_value_(保证str()调用返回正确结果) - 将属性字典中的键值对逐个绑定到枚举成员实例上,实现直接访问属性的需求
内容的提问来源于stack exchange,提问作者midrare
相关产品推荐
相关产品推荐

