枚举有一个便捷的定义方式
from enum import Enum WeekEnd = Enum('WeekEnd', ('Mon','Tues','Wed','Thurs','Fri','Sat','Sun'))
上述例子,定义一个枚举类型 WeekEnd,并指定这个枚举类型的类标识也是'WeekEnd'(保持一致)(第二个WeekEnd为类标识。)。默认枚举成员的整数值member.value从1开始(如果不指定的话)。
枚举一旦创建好了,成员的name和value就都不可变更了
枚举成员member包含两个属性,一个是name,一个是value。其中,name不允许重复,如果用unique修饰了枚举类的话,则value也不允许重复
如果需要更精确地控制枚举类型,比如让成员的value不从1开始,而是从0开始,可以从Enum派生出自定义类:
1 from enum import Enum,unique 2 3 @unique 4 class WeekEnd(Enum): 5 Sun = 0 6 Mon = 1 7 Tue =2 8 Wed = 3 9 Thu = 4 10 Fri = 5 11 Sat =6 12 13 print(WeekEnd.Mon)#WeekEnd.Mon等同于WeekEnd['Mon']和WeekEnd(1),都是表示Mon这个member 14 print(WeekEnd.Mon.value) #1 15 print(WeekEnd.Mon.name) #Mon 16
如果枚举中存在相同值的成员,在通过值获取枚举成员时,只能获取到第一个成员,第二个成员的名称被视作第一个成员的别名
1 from enum import Enum 2 3 class Color(Enum): 4 red = 1 5 red_alias = 1 6 7 print(Color(1))
输出结果为:Color.red
与Enum相似的还有一个intEnum,如果我们定义的枚举继承自intEnum而不是Enum,则value只能是数字
枚举支持迭代:
1 class Color(Enum): 2 red = 1 3 red_alias = 1 4 blue = 2 5 for color in Color: 6 print (color)
输出结果
Color.red
Color.blue
上面例子,枚举有值重复的成员,循环遍历枚举时只获取值重复成员的第一个成员
如果想把值重复的成员也遍历出来,要用枚举的一个特殊属性__members__
for name,member in Color.__members__.items(): print(name,member)
输出结果:
red Color.red
red_alias Color.red
blue Color.blue
成员可以进行同一性,等值比较,但不能进行大小比较
print (Color.red is Color.red_alias)#true print (Color.red == Color.red_alias)#true
Color.red < Color.blue#语法错误
最后一点,由于枚举成员本身也是枚举类型,因此也可以通过枚举成员找到其它成员:
Color.blue等同于Color.red.blue