gpt4 book ai didi

python - 在python3中实现枚举类型的比较运算符

转载 作者:行者123 更新时间:2023-12-04 23:16:49 24 4
gpt4 key购买 nike

我真的是 Python 的初学者,所以如果这很明显,请原谅我。

我有一个枚举类,我希望能够比较成员。下面的代码似乎做我想做的(但不是我想要的)

import enum

class AB(enum.Enum):

a=1
b=2
c=3
d=4
e=5

@classmethod
def le(cls, a, b):
lst = [cls.a, cls.b, cls.c, cls.d, cls.e]
ia = lst.index(a)
ib = lst.index(b)
return(ia <= ib)


if AB.le(AB.a, AB.b):
print('Do this')
else:
print('Do that')

现在我的问题是如何编写比较运算符 __le__以便我可以运行以下代码?
mem1 = AB.a
mem2 = AB.c

if mem1 <= mem2 :
print('Do this')
else:
print('Do that')

最佳答案

Enum子类有些特殊,因为所有枚举值都成为类的实例(有一些调整)。这确实意味着您可以“仅”在 Enum 上定义一个普通方法。子类,它们将在每个枚举值上可用。

这适用于特殊方法,如 object.__le__()也;只需将其定义为常规方法,而不是 classmethod :

class AB(enum.Enum):
def __le__(self, b):
return self.value <= b.value

a = 1
b = 2
c = 3
d = 4
e = 5

请注意,我使用了 instance attribute .value ,就像你可以做的 AB.a.value .

您也可以使用 IntEnum class ;使每个枚举值成为 int 的子类,它们可以很自然地进行比较:
class AB(enum.IntEnum):
a = 1
b = 2
c = 3
d = 4
e = 5

演示:
>>> import enum
>>> class AB(enum.Enum):
... def __le__(self, b):
... return self.value <= b.value
... a = 1
... b = 2
... c = 3
... d = 4
... e = 5
...
>>> AB.a <= AB.b
True
>>> AB.b <= AB.a
False
>>> AB.a < AB.b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: AB() < AB()

并使用 IntEnum作为基础:
>>> class AB(enum.IntEnum):
... a = 1
... b = 2
... c = 3
... d = 4
... e = 5
...
>>> AB.a <= AB.b
True
>>> AB.b >= AB.a
True
>>> AB.b > AB.a
True
>>> AB.a + AB.b
3

关于python - 在python3中实现枚举类型的比较运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39072301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com