枚举类是一些具有特殊含义的类,比如用一个类表示月份,则该类的实例对象最多有 12 个,一周则有7个对象,Python 3.4 中新增加了 Enum 枚举类,对于这些实例化对象个数固定的类,可以用枚举类来定义。
from enum import Enum # 第一个参数用于指定枚举类的类名,第二个参数用于指定枚举类中的多个成员。 Colors = Enum("Colors", ('red', 'green', 'blue')) # 未指定值,默认从 1 开始递增 print(Colors.red.value) print(Colors.green.value) print(Colors.blue.value) ### 运行结果 1 2 3
from enum import Enum class Color(Enum): # 为序列值指定value值 red = 1 green = 2 blue = 3 #调用枚举成员的 3 种方式 print(Color.red) print(Color['red']) print(Color(1)) #调取枚举成员中的 value 和 name print(Color.red.value) print(Color.red.name) #遍历枚举类中所有成员的 2 种方式 for color in Color: print(color) ### 运行结果: Color.red Color.red Color.red 1 red Color.red Color.green Color.blue
1.正常使用
print(Color.red == Color.green) print(Color.red.name is Color.green.name) ### 运行结果 Flase Flase
2.不能在类的外部做任何修改,下面语法的做法是错误的:
Color.red = 4 报错: raise AttributeError('Cannot reassign members.') AttributeError: Cannot reassign members.
3.枚举类中各个成员必须保证 name 互不相同,但 value 可以相同,举个例子:
class Color(Enum): # 为序列值指定value值 red = 1 green = 1 blue = 3 print(Color['green']) ### 运行结果 Color.red
可以看到,Color 枚举类中 red 和 green 具有相同的值(都是 1),Python 允许这种情况的发生,它会将 green 当做是 red 的别名,因此当访问 green 成员时,最终输出的是 red。
4.设置value唯一性,不允许出现相同的value
#引入 unique from enum import Enum,unique #添加 unique 装饰器 @unique class Color(Enum): # 为序列值指定value值 red = 1 green = 1 blue = 3 print(Color['green']) ### 运行结果报错: Traceback (most recent call last): File "test.py", line 3, in <module> class Color(Enum): File "/python3.6/lib/enum.py", line 834, in unique (enumeration, alias_details)) ValueError: duplicate values found in <enum 'Color'>: green -> red