2022年 11月 3日

Python 枚举

在python里,枚举对象就是一个类,比较简单的方式就是定义一个类,并让它继承enum.Enum。枚举的用处在于建立一套两组值之间的映射关系。比如,流程状态有“流转中”、“已关闭”、“手动结束”等;网站用户状态有“未注册”、“已注册”、“已注销”。这些状态在数据库存储时,考虑性能,往往会用数字,如0、1、2表示。而如果在代码里直接写数字又是十分不友好的行为。因此,一套映射关系就可以方便在两组数据间进行转换。很容易的,我们会想到字典就能实现这个功能。但是,字典是可变对象。而上面的场景中,我们肯定希望的是一个固定不变的关系。

1、实现一个枚举类

  1. from enum import Enum
  2. class Color(Enum):
  3. RED = '#F44336'
  4. BLUE = '#2196F3'
  5. GREEN = '#4CAF50'

我们在开发网页的时候,为了更好的视觉效果。我们会自定义一些常用的颜色。枚举除了不可修改以外,还有个特点就是会对名称和值均进行唯一校验。对名称进行唯一校验和字典校验主键一样,而当两个枚举类型的值相同时,会被认为是同一个枚举类型。

  1. class Color(Enum):
  2. RED = '#F44336'
  3. # 值相同的会被认为是同一个枚举类型,这里可以理解为别名
  4. Red = '#F44336'
  5. BLUE = '#2196F3'
  6. GREEN = '#4CAF50'

2、访问枚举对象

  1. # 获取某一个枚举值,这个相当于已知名称获取值
  2. print(Color.RED.value)
  3. # 获取一个枚举类型
  4. print(Color.RED)
  5. print(Color['Red'])
  6. # 获取枚举名称(字符串)
  7. print(Color.RED.name)
  8. # 类型转换,这个相当于已知值获取类型
  9. print(Color('#2196F3'))
  10. # 输出:
  11. #F44336
  12. Color.RED
  13. Color.RED
  14. RED
  15. Color.BLUE

3、遍历枚举对象

  1. for c in Color:
  2. print(c)
  3. # 输出:
  4. Color.RED
  5. Color.BLUE
  6. Color.GREEN

这里就可以看到,虽然我们定义了两个“红色”。但因为值是相同的,因此会被认为是同一个枚举类型。当然,如果我们想将’Red’也打印出来,可以这样做

  1. # 会打印别名
  2. for c in Color.__members__.items():
  3. print(c)
  4. # 输出:
  5. ('RED', <Color.RED: '#F44336'>)
  6. ('Red', <Color.RED: '#F44336'>)
  7. ('BLUE', <Color.BLUE: '#2196F3'>)
  8. ('GREEN', <Color.GREEN: '#4CAF50'>)

从这个结果也可以看出,RED和Red虽然名称不同,但都是同一个枚举类型。