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

kol*_*ery 4 python enums python-3.x

我是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')
Run Code Online (Sandbox Code Playgroud)

现在我的问题是如何编码比较运算符,__le__以便我可以运行下面的代码?

mem1 = AB.a
mem2 = AB.c

if mem1 <= mem2 :
    print('Do this')
else:
    print('Do that')
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 7

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
Run Code Online (Sandbox Code Playgroud)

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

你也可以使用这IntEnum门课 ; 这使得每个枚举值成为其子类int,并且它们可以自然地进行比较:

class AB(enum.IntEnum):
    a = 1
    b = 2
    c = 3
    d = 4
    e = 5
Run Code Online (Sandbox Code Playgroud)

演示:

>>> 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()
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)