我是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')
答案 0 :(得分:5)
Enum
子类有点特殊,因为所有枚举值都成为类的实例(带有一些调整)。这意味着您可以“只”在Enum
子类上定义一个普通方法,它们将在每个枚举值上可用。
这也适用于object.__le__()
之类的特殊方法;只需将其定义为常规方法,不 a 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
答案 1 :(得分:1)
__le__
方法应该作为LHS操作数的成员函数调用,并以RHS操作数作为参数。
但是,从您的代码中不清楚AB
对象的哪些成员变量应该用于比较,因此我无法为您编写代码。
大致看起来应该是这样的:
def __le__(self, b):
return # do something with self and b to figure out which one would be <=
答案 2 :(得分:0)
感谢@Rawing和@machine向往,
import enum
class AB(enum.Enum):
a=1
b=2
c=3
d=4
e=5
def __le__(self, other):
return(self.value <= other.value)
if AB.c <= AB.d:
print('Do this')
else:
print('Do that')