Python 枚举(enum)
枚举(enum)
1.枚举模块enum
从3.x开始python提供了enum模块来提供枚举的功能,在使用时通过from enum import Enum 来引入。开发人员需要自己定义一个继承Enum的类来实现枚举类型对象。python的枚举是使用类来实现的,类属性是枚举名称,属性值对应枚举值。Enum的使用有如下特点:
- 枚举类不允许定义相同枚举名称,但不同的枚举名称可以有相同的值,后者相当于前者的别名。
- 枚举值不能被修改,枚举值一旦被修改,就会引发AttributeError异常。
- 两个不同的枚举类,枚举名称和枚举值即便相同,在比较时也是不相等的。
- 枚举类的一个枚举有name(标签)和value(枚举值)两个属性,使用枚举值时,务必通过value获取枚举值。
2. Enum使用示例
import enum
class ColorCode(enum.Enum):
RED = 1
BLUE = 2
BLACK = 3
def print_color(color_code):
if color_code == ColorCode.RED.value:
print('红色')
elif color_code == ColorCode.BLUE.value:
print('蓝色')
elif color_code == ColorCode.BLACK.value:
print('黑色')
3. 枚举值
3.1 枚举值唯一
枚举值理论上是允许重复的,如果不希望出现枚举值重复的情况,可以使用enum模块提供的unique装饰器
import enum
from enum import unique
@unique
class ColorCode(enum.Enum):
RED = 1
BLUE = 1
BLACK = 3
3.2 枚举值遍历
使用for循环可以对枚举值进行遍历,枚举有name和value两个属性,name就是枚举类的类属性,value则是类属性的值。
import enum
from enum import unique
@unique
class ColorCode(enum.Enum):
RED = 1
BLUE = 2
BLACK = 3
for color in ColorCode:
print(color.name, color.value)
程序输出结果
RED 1
BLUE 2
BLACK 3
3.3 枚举值比较
两个枚举值之间只支持身份运算符is和比较运算符==进行比较。以4.2 小结的代码为例演示枚举值如何进行比较。
print(ColorCode.RED == ColorCode.RED) # True
这看起来没有什么特别,但如果使用枚举和对应的值进行比较,就会产生一些出乎意料的结果
print(ColorCode.RED == 1) # False
这是非常容易出错的地方,很多人相当然的认为ColorCode.RED与1是相等的,但真实的结果却是False,RED是一项枚举,枚举有name和value两个属性,必须通过value才能获得真实的枚举值
print(ColorCode.RED.value == 1) # True
或者换一个思路,将枚举值转成枚举类型
print(ColorCode.RED == ColorCode(1)) # True
ColorCode(1)) 的结果正是ColorCode.RED。

浙公网安备 33010602011771号