在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虽然名称不同,但都是同一个枚举类型。