Python中Enum和IntEnum的区别

Python中Enum和IntEnum的区别,python,python-3.x,class,enums,Python,Python 3.x,Class,Enums,我遇到了一个类似这样的代码: class State(IntEnum): READY = 1 IN_PROGRESS = 2 FINISHED = 3 FAILED = 4 我得出结论,这个State类可以以相同的方式继承Enum类 从IntEnum继承给了我什么,而从常规类Enum继承给了我什么?它们之间的区别是什么?来自python: 枚举:用于创建枚举常量的基类 以及: IntEnum:用于创建枚举常量的基类,枚举常量也是int的子类 它说,IntEnum

我遇到了一个类似这样的代码:

class State(IntEnum):
    READY = 1
    IN_PROGRESS = 2
    FINISHED = 3
    FAILED = 4
我得出结论,这个State类可以以相同的方式继承
Enum

IntEnum
继承给了我什么,而从常规类
Enum
继承给了我什么?它们之间的区别是什么?

来自python:

枚举:用于创建枚举常量的基类

以及:

IntEnum:用于创建枚举常量的基类,枚举常量也是int的子类

它说,
IntEnum
的成员可以与整数进行比较;通过扩展,还可以相互比较不同类型的整数枚举

请看下面的示例:

class Shape(IntEnum):
    CIRCLE = 1
    SQUARE = 2

class Color(Enum):
    RED = 1
    GREEN = 2

Shape.CIRCLE == Color.RED
>> False

Shape.CIRCLE == 1
>>True
它们的行为将与整数相同:

['a', 'b', 'c'][Shape.CIRCLE]
>> 'b'

IntEnum用于确保成员必须是整数,即

class State(IntEnum):
  READY = 'a'
  IN_PROGRESS = 'b'
  FINISHED = 'c'
  FAILED = 'd'
这将引发一个异常:

ValueError: invalid literal for int() with base 10: 'a'

好的,如果您已经阅读了OP的文档,那么
Enum
IntEnum
之间最明显的区别可能是
Color.RED
会引起
类型错误,而
Shape.CIRCLE
不会。@DeepSpace确定,我加上最后一部分,它们的作用与整数相同。这里还有几个例子可以解释。谢谢你这么说,伙计。@DeepSpace,我读了文档,但写的都是
基类,用于创建枚举常量,这些常量也是int的子类。
。这并没有告诉你为什么要用一个而不是另一个,即使你认为一个更适合我。我发现用例和解释@ MeHordad PeTrErFrad非常有用。一个好处是IntUm允许默认排序,EnUM不默认。我不认为这是主要区别。确保成员值为整数是一种约束,而不是一种功能,因为
IntEnum
提供了与整数的直接比较(如果
Enum
没有,则必须访问
.value
属性)。这只能在值为整数时正确发生,因此类会为您检查这一点。