一.枚举其实是一个类
建议标识名字用大写
1.枚举类:
from enum importEnumclassVIP(Enum):
YELLOW= 1GREEN= 2BLACK= 3RED= 4
print(VIP.YELLOW)#VIP.YELLOW #关注的是它的标签不是数字
2 枚举和普通类相比的优势
三种其他的普通方法表示枚举:
(1)
yellow= 1green= 2(2)字典的表示方式
{'yellow':1,'green':2}
(3)类的表示方式classTypeDiamond():
yellow= 1green= 2
这些方式,它们都是可变的,可以在代码中轻易的更改值,且没有防止相同标签的功能。
3.枚举的特点:
from enum importEnumclassVIP(Enum):
YELLOW= 1#YELLOW= 2 #不可重复,报错
BLACK= 3RED= 4
print(VIP.YELLOW)#VIP.YELLOW = 6 #不可更改,报错
二.枚举类型、枚举名称与枚举值
1.获取枚举类型下某一数值:
from enum importEnumclassVIP(Enum):
YELLOW= 1GREEN= 2BLACK= 3RED= 4print(VIP.YELLOW.value)print(VIP.YELLOW.name)print(VIP.YELLOW)print(VIP['YELLOW'])#1 #枚举值
#YELLOW # 获取标签名
#VIP.YELLOW # 枚举类型
#VIP.YELLOW
2.枚举是可以遍历的:
from enum importEnumclassVIP(Enum):
YELLOW= 1GREEN= 2BLACK= 3RED= 4
for v inVIP :print(v)#VIP.YELLOW
VIP.GREEN
VIP.BLACK
VIP.RED
三. 枚举的比较运算
1.两个枚举之间可以使用等值比较(==),枚举与数值比较的判断结果不对。两个枚举之间不能进行大小比较。
2.支持is操作:
result = VIP.GREEN isVIP.GREEN#True
3.两个大类之间也可以进行等值比较,不过结果是False:
from enum importEnumclassVIP(Enum):
YELLOW= 1GREEN= 2BLACK= 3RED= 4
classVIP1(Enum):
YELLOW= 1GREEN= 2BLACK= 3RED= 4
print(VIP.GREEN ==VIP1.GREEN)#False
四.枚举注意事项
1.枚举的数值可以相同,在这种情况下,将第二种枚举类型看成别名。遍历时不会打印别名:
classVIP(Enum):
YELLOW= 1GREEN= 1 #别名,不会报错
BLACK= 3RED= 4
print(VIP.GREEN)#VIP.YELLOW
2.把别名加入遍历循环:
(1)for v in VIP.__members__.items() :print(v)#('YELLOW', )
#('GREEN', )
#('BLACK', )
#('RED', )
(2)
或者遍历__members__:for v in VIP.__members__:print(v)#YELLOW
#GREEN
#BLACK
#RED
五.枚举转换
1.在数据库里一般存储数值或者标签名字来代表枚举类型,推荐存储数值,数字占用的空间更小。但是不建议在代码种用数值代表枚举,可读性不强。
2.如何将数字转换成枚举类型:
from enum importEnum
a= 1
classVIP(Enum):
YELLOW= 1GREEN= 2BLACK= 3RED= 4
print(VIP(a)) #转换枚举类型
#VIP.YELLOW
六.枚举小结
1.要求每个枚举类型都是数字的时候继承IntEnum:
from enum importIntEnumclassVIP(IntEnum):
YELLOW= 1GREEN= 2BLACK= 3RED= 4
2.限制不同的枚举类型不能取相同的值:
from enum importEnumfrom enum importIntEnum,unique
@unique#装饰器
classVIP(IntEnum):
YELLOW= 1GREEN= 2BLACK= 3RED= 4
枚举类型不能实例化,属于单例模式