在python里,枚举对象就是一个类,比较简单的方式就是定义一个类,并让它继承enum.Enum。枚举的用处在于建立一套两组值之间的映射关系。比如,流程状态有“流转中”、“已关闭”、“手动结束”等;网站用户状态有“未注册”、“已注册”、“已注销”。这些状态在数据库存储时,考虑性能,往往会用数字,如0、1、2表示。而如果在代码里直接写数字又是十分不友好的行为。因此,一套映射关系就可以方便在两组数据间进行转换。很容易的,我们会想到字典就能实现这个功能。但是,字典是可变对象。而上面的场景中,我们肯定希望的是一个固定不变的关系。
1、实现一个枚举类
- from enum import Enum
-
-
- class Color(Enum):
- RED = '#F44336'
- BLUE = '#2196F3'
- GREEN = '#4CAF50'
我们在开发网页的时候,为了更好的视觉效果。我们会自定义一些常用的颜色。枚举除了不可修改以外,还有个特点就是会对名称和值均进行唯一校验。对名称进行唯一校验和字典校验主键一样,而当两个枚举类型的值相同时,会被认为是同一个枚举类型。
- class Color(Enum):
- RED = '#F44336'
- # 值相同的会被认为是同一个枚举类型,这里可以理解为别名
- Red = '#F44336'
- BLUE = '#2196F3'
- GREEN = '#4CAF50'
2、访问枚举对象
- # 获取某一个枚举值,这个相当于已知名称获取值
- print(Color.RED.value)
- # 获取一个枚举类型
- print(Color.RED)
- print(Color['Red'])
- # 获取枚举名称(字符串)
- print(Color.RED.name)
- # 类型转换,这个相当于已知值获取类型
- print(Color('#2196F3'))
-
-
- # 输出:
- #F44336
- Color.RED
- Color.RED
- RED
- Color.BLUE
3、遍历枚举对象
- for c in Color:
- print(c)
-
-
- # 输出:
- Color.RED
- Color.BLUE
- Color.GREEN
这里就可以看到,虽然我们定义了两个“红色”。但因为值是相同的,因此会被认为是同一个枚举类型。当然,如果我们想将’Red’也打印出来,可以这样做
- # 会打印别名
- for c in Color.__members__.items():
- print(c)
-
-
- # 输出:
- ('RED', <Color.RED: '#F44336'>)
- ('Red', <Color.RED: '#F44336'>)
- ('BLUE', <Color.BLUE: '#2196F3'>)
- ('GREEN', <Color.GREEN: '#4CAF50'>)
从这个结果也可以看出,RED和Red虽然名称不同,但都是同一个枚举类型。