枚举类型

枚举在Python3之后才出现的类型,Python2不支持枚举类型。 枚举类型用于声明一组命名的常数,使用枚举类型可以增强代买的可读性。

枚举的应用场景

假设有这样一个函数

  1. def print_color(color_code):
  2. if color_code == 1:
  3. print('红色')
  4. elif color_code == 2:
  5. print('蓝色')
  6. elif color_code == 3:
  7. print('黑色')

参数color_code取值有3种,1表示红色,2表示蓝色,3表示黑色。color_code是表示颜色的代码,只有3种取值,这种情形下就适合使用枚举类型来表示,在python没有枚举类型之前,可以使用类来定义枚举类型。

  1. class ColorCode:
  2. RED = 1
  3. BLUE = 2
  4. BLACK = 3
  5. def print_color(color_code):
  6. if color_code == ColorCode.RED:
  7. print('红色')
  8. elif color_code == ColorCode.BLUE:
  9. print('蓝色')
  10. elif color_code == ColorCode.BLACK:
  11. print('黑色')
  12. print_color(1)

函数里不再用color_code和1,2,3这些整数值进行比较,而是与ColorCode的类属性进行比较,代码可阅读性更好,因为只看1,2,3,你无法理解这些数字所代表的含义。虽然使用类可以模拟枚举类型,但这种技术有一个缺点,类属性可以随意修改。

Enum类型的应用

Python3 提供了enum模块,定义类时继承enum.Enum,可以创建一个枚举类型数据,代码如下:

  1. import enum
  2. class ColorCode(enum.Enum):
  3. RED = 1
  4. BLUE = 2
  5. BLACK = 3
  6. def print_color(color_code):
  7. if color_code == ColorCode.RED.value:
  8. print('红色')
  9. elif color_code == ColorCode.BLUE.value:
  10. print('蓝色')
  11. elif color_code == ColorCode.BLACK.value:
  12. print('黑色')
  13. print_color(1)

看上去和第2小节里的代码没有什么大的区别,但由于继承了enum.Enum,ColorCode的类属性将无法修改,如果执行

  1. ColorCode.RED = 4

将会引起异常

  1. raise AttributeError('Cannot reassign members.')
  2. AttributeError: Cannot reassign members.

枚举值唯一

为了防止定义枚举值时出现重复的值,enum模块还提供了unique装饰器,

  1. import enum
  2. from enum import unique
  3. @unique
  4. class ColorCode(enum.Enum):
  5. RED = 1
  6. BLUE = 1
  7. BLACK = 3

如果枚举值出现了重复的情况,由于有unique装饰器修饰,因此在执行时会报错。

枚举值遍历

可以使用for循环对枚举值进行遍历

  1. import enum
  2. from enum import unique
  3. @unique
  4. class ColorCode(enum.Enum):
  5. RED = 1
  6. BLUE = 2
  7. BLACK = 3
  8. for color in ColorCode:
  9. print(color.name, color.value)

程序输出结果

  1. RED 1
  2. BLUE 2
  3. BLACK 3

枚举值比较

枚举值之间不支持 > 和 < 操作,但支持等值比较和is身份比较