Python中Enum和IntEnum之间的区别

Yuv*_*uss 7 python enums python-3.x

我遇到了一个看起来像这样的代码:

class State(IntEnum):
    READY = 1
    IN_PROGRESS = 2
    FINISHED = 3
    FAILED = 4
Run Code Online (Sandbox Code Playgroud)

我得出的结论是,这个State类可以Enum以相同的方式继承该类。

从继承继承IntEnum给我的东西是什么,而从常规类继承不会给我带来Enum什么呢?它们之间有什么区别?

Meh*_*far 10

从python Docs

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

和:

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

它说IntEnum可以将an的成员与整数进行比较;通过扩展,也可以将不同类型的整数枚举进行比较。

看下面的例子:

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

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

Shape.CIRCLE == Color.RED
>> False

Shape.CIRCLE == 1
>>True
Run Code Online (Sandbox Code Playgroud)

它们的行为与整数相同:

['a', 'b', 'c'][Shape.CIRCLE]
>> 'b'
Run Code Online (Sandbox Code Playgroud)

  • 好吧,如果您已经阅读了 OP 的文档,那么对于 `Enum` 和 `IntEnum` 之间的区别来说,最明显的例子可能是 `Color.RED < Color.GREEN` 将引发一个 `TypeError` 而`Shape。 CIRCLE < Shape.SQUARE` 不会。 (5认同)

bak*_*rak 5

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

class State(IntEnum):
  READY = 'a'
  IN_PROGRESS = 'b'
  FINISHED = 'c'
  FAILED = 'd'
Run Code Online (Sandbox Code Playgroud)

这将引发异常:

ValueError: invalid literal for int() with base 10: 'a'
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这是主要区别。确保成员值是整数是一个约束而不是一个功能,因为“IntEnum”提供了与整数的直接比较(“Enum”不这样做,您必须访问“.value”属性)。只有当值是整数时,这种情况才能正确发生,因此该类会为您检查这一点。 (2认同)