在python3中实现Enum类型的比较运算符

时间:2016-08-22 06:05:29

标签: python python-3.x enums

我是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')

3 个答案:

答案 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')