Python 枚举类型

水深无声 2023-06-14 10:52 72阅读 0赞

#

起步

枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期、月份、状态等。在没有专门提供枚举类型的时候我们是怎么做呢,一般就通过字典或类来实现:

  1. Color = {
  2. 'RED' : 1,
  3. 'GREEN': 2,
  4. 'BLUE' : 3,
  5. }
  6. class Color:
  7. RED = 1
  8. GREEN = 2
  9. BLUE = 3

这种来实现枚举如果小心翼翼地使用当然没什么问题,毕竟是一种妥协的解决方案。它的隐患在于可以被修改。

#

使用 Enum

简单的示例:

  1. from enum import Enum
  2. class Color(Enum):
  3. red = 1
  4. green = 2
  5. blue = 3

枚举成员值默认可重复,枚举成员具有友好的字符串表示:

  1. >>> print(Color.red)
  2. Color.red
  3. >>> print(repr(Color.red))
  4. <Color.red: 1>
  5. >>> type(Color.red)
  6. <Enum 'Color'>
  7. >>> isinstance(Color.green, Color)
  8. True

枚举类型不可实例化,不可更改。

定义枚举

定义枚举时,成员名不允许重复

  1. class Color(Enum):
  2. red = 1
  3. green = 2
  4. red = 3 # TypeError: Attempted to reuse key: 'red'

成员值允许相同,第二个成员的名称被视作第一个成员的别名

  1. class Color(Enum):
  2. red = 1
  3. green = 2
  4. blue = 1
  5. print(Color.red) # Color.red
  6. print(Color.blue) # Color.red
  7. print(Color.red is Color.blue)# True
  8. print(Color(1)) # Color.red 在通过值获取枚举成员时,只能获取到第一个成员

若要不能定义相同的成员值,可以通过 unique 装饰

  1. from enum import Enum, unique
  2. @unique
  3. class Color(Enum):
  4. red = 1
  5. green = 2
  6. blue = 1 # ValueError: duplicate values found in <enum 'Color'>: blue -> red

#

枚举取值

可以通过成员名来获取成员,也可以通过成员值来获取成员:

  1. print(Color['red']) # Color.red 通过成员名来获取成员
  2. print(Color(1)) # Color.red 通过成员值来获取成员

每个成员都有名称属性和值属性:

  1. member = Color.red
  2. print(member.name) # red
  3. print(member.value) # 1

支持迭代的方式遍历成员,按定义的顺序,如果有值重复的成员,只获取重复的第一个成员:

  1. for color in Color:
  2. print(color)

特殊属性 __members__ 是一个将名称映射到成员的有序字典,也可以通过它来完成遍历:

  1. for color in Color.__members__.items():
  2. print(color) # ('red', <Color.red: 1>)

#

枚举比较

枚举的成员可以通过 is 同一性比较或通过 == 等值比较:

  1. Color.red is Color.red
  2. Color.red is not Color.blue
  3. Color.blue == Color.red
  4. Color.blue != Color.red

枚举成员不能进行大小比较:

  1. Color.red < Color.blue # TypeError: unorderable types: Color() < Color()

#

扩展枚举 IntEnum

IntEnumEnum 的扩展,不同类型的整数枚举也可以相互比较:

  1. from enum import IntEnum
  2. class Shape(IntEnum):
  3. circle = 1
  4. square = 2
  5. class Request(IntEnum):
  6. post = 1
  7. get = 2
  8. print(Shape.circle == 1) # True
  9. print(Shape.circle < 3) # True
  10. print(Shape.circle == Request.post) # True
  11. print(Shape.circle >= Request.post) # True

发表评论

表情:
评论列表 (有 0 条评论,72人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Python 类型

    起步 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期、月份、状态等。在没有专门提供枚举类型的时候我们是怎么做呢,一般就通过

    相关 C#——类型

    C\——枚举类型 枚举类型 是由基础整型数值类型的一组命名常量定义的值类型。 若要定义枚举类型,请使用 enum 关键字并指定枚举成员 的名称: enum Se

    相关 类型

    枚举类型的定义和枚举变量的说明  1.  枚举的定义枚举类型定义的一般形式为:      enum 枚举名\{ 枚举值表 \};  在枚举值表中应罗列出所有可用值。