python 枚举

枚举有一个便捷的定义方式

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

原文地址:https://www.cnblogs.com/saolv/p/8737333.html