【问题标题】:Difference between Enum and IntEnum in PythonPython 中 Enum 和 IntEnum 的区别
【发布时间】:2019-03-26 13:32:53
【问题描述】:

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

class State(IntEnum):
    READY = 1
    IN_PROGRESS = 2
    FINISHED = 3
    FAILED = 4

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

IntEnum 继承有什么让我从常规类Enum 继承不会?它们有什么区别?

【问题讨论】:

  • 好吧,@DeepSpace,我阅读了文档,但写的都是Base class for creating enumerated constants that are also subclasses of int.。这并没有告诉您为什么要使用其中一种,甚至认为一种更适合我。我发现@mehrdad-pedramfar 的用例和解释非常有帮助。
  • 一个好处是 IntEnum 默认允许排序,Enum 默认不允许。

标签: python python-3.x class enums


【解决方案1】:

来自pythonDocs

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

和:

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'

【讨论】:

  • 好吧,如果您已经阅读了 OP 的文档,那么EnumIntEnum 之间差异的最明显示例可能是 Color.RED < Color.GREEN 将引发 TypeError 而 @ 987654329@不会。
  • @DeepSpace 当然,我添加了最后一部分,说它们出于相同目的而像整数一样。还有几个例子可以在这里解释。谢谢你说,伙计。
【解决方案2】:

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

class State(IntEnum):
  READY = 'a'
  IN_PROGRESS = 'b'
  FINISHED = 'c'
  FAILED = 'd'

这将引发异常:

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

【讨论】:

  • 我不会认为这是主要区别。确保成员值是整数是一个约束而不是一个特性,因为IntEnum 提供了与整数的直接比较(Enum 不这样做,您必须访问.value 属性)。这只有在值是整数时才能正确发生,因此该类会为您检查。
【解决方案3】:

intEnum 具有以下优点:

1/ 确保成员必须是整数

(ValueError: invalid literal for int() with base 10 不满意会加薪)

2/ 允许与整数比较

import enum

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

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

print(Shape.CIRCLE == 1)
# >> True

print(Color.RED == 1)
# >> False

【讨论】:

    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2020-10-29
    • 2020-11-24
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    相关资源
    最近更新 更多