19 枚举
枚举的概念
枚举也是类
定义枚举需要先导入枚举模块:
from enum import Enum
枚举类型的定义
class Color(Enum): RED = 1 YELLOW = 2 # 且它们不是常量! GREEN = 3 #必须大写,且各枚举属性的值不能相等 print(Color.RED) #打印结果就是Color.RED 这就是枚举的意义所在
枚举与普通的类比有什么优势
枚举类型的属性值是不能更改的。
枚举的相关操作
获取枚举标签(属性)的值:类名.属性名.value
获取枚举标签名(属性名):类名.属性名.name 注意:打印的结果是str型
print(type(Color.RED)) print(type(Color.RED.name)) 结果: <enum 'Color'> <class 'str'>
枚举的遍历
for c in Color: print(c) 结果: Color.RED Color.RED Color.YELLOW Color.GREEN
枚举之间的比较运算
枚举之间的比较不是value的比较,而是对象的比较。
所以可以做等值比较,即 == 或 is 或 is not比较:
# 赋值Color为Color1 print(Color.RED == Color.RED) print(Color.RED == Color1.RED) print(Color.RED is Color1.RED) print(Color.RED is not Color1.RED) 结果: True False False True
枚举转换
一般将枚举标签的值存在数据库而不是枚举标签。
所以当从数据库将value值提出来,要得到枚举的标签:
# a为接收来自数据库的枚举的变量 a = 1 #假设a接收到的值为1 #转换为枚举标签 : 枚举类名(a) 如上面的: print(Color(1)) 结果为: Color.RED
枚举需要注意的事情
1.枚举不能有两个相同名的标签
2.两个不同的标签的value不能相同,如果相同,则表示一个是另一个的别名,且普通遍历时不会将别名打印出来(若想遍历出来,使用.__member__属性)
IntEnum
Enum类下的枚举标签的值,可以是数值型,也可以是字符串类型。
但当想要其类型仅为数值型时,使用IntEnum就行了。
from enum import IntEnum
@unique
当你不想个标签起别名(不同的标签名相同的value)
导入unique,然后声明类时在类上面加上@unique即可,此时如果起别名会报错:
from enum import unique @unique class B(Enum): AA = 1 BB = 1
报错结果:
ValueError: duplicate values found in <enum 'B'>: BB -> AA