创建支持元组值的自定义Python Enum子类需哪些方法?
自定义TupleEnum实现类似IntEnum的自动转换
核心问题解决:让实例自动转换为元组值
IntEnum能被numpy自动转换为对应整数,是因为它同时继承了int和Enum,属于整数类型的子类。要让你的TupleEnum实现类似效果,有两种可靠方案:
方案1:继承tuple和Enum(推荐,对齐IntEnum实现逻辑)
直接让TupleEnum同时继承tuple和enum.Enum,这样每个枚举成员既是元组实例,又是枚举成员,numpy会自动识别为元组处理:
import enum import numpy as np class TupleEnum(tuple, enum.Enum): def __eq__(self, other): if isinstance(other, enum.Enum): return self.value == other.value else: return self == other # 作为tuple子类可直接比较 def __hash__(self): return hash(self.value) # 测试 class Tuples(TupleEnum): A = (0, 0, 0) B = (1, 1, 1) print(np.array([Tuples.A, Tuples.B])) # 输出: array([[0, 0, 0], [1, 1, 1]])
方案2:实现__array__方法
如果不想改变继承结构,可给TupleEnum添加__array__方法,明确告诉numpy如何将枚举实例转换为数组:
import enum import numpy as np class TupleEnum(enum.Enum): def __eq__(self, other): if isinstance(other, enum.Enum): return self.value == other.value else: return self.value == other def __hash__(self): return hash(self.value) def __array__(self, dtype=None): return np.asarray(self.value, dtype=dtype) # 测试 class Tuples(TupleEnum): A = (0, 0, 0) B = (1, 1, 1) print(np.array([Tuples.A, Tuples.B])) # 输出: array([[0, 0, 0], [1, 1, 1]])
推荐额外实现的方法
除了你提到的__str__,还建议添加以下方法提升易用性:
__iter__: 让枚举成员可以像普通元组一样被迭代,比如for x in Tuples.A:def __iter__(self): return iter(self.value)__getitem__: 支持通过索引访问元组元素,比如Tuples.A[0]def __getitem__(self, index): return self.value[index]__len__: 返回元组长度,比如len(Tuples.A)def __len__(self): return len(self.value)__repr__: 自定义打印时的显示格式,让输出更清晰def __repr__(self): return f"<{self.__class__.__name__}.{self.name}: {self.value}>"
内容的提问来源于stack exchange,提问作者Jaime
相关产品推荐
相关产品推荐

