枚举类型
枚举在Python3之后才出现的类型,Python2不支持枚举类型。 枚举类型用于声明一组命名的常数,使用枚举类型可以增强代买的可读性。
枚举的应用场景
假设有这样一个函数
def print_color(color_code):
if color_code == 1:
print('红色')
elif color_code == 2:
print('蓝色')
elif color_code == 3:
print('黑色')
参数color_code取值有3种,1表示红色,2表示蓝色,3表示黑色。color_code是表示颜色的代码,只有3种取值,这种情形下就适合使用枚举类型来表示,在python没有枚举类型之前,可以使用类来定义枚举类型。
class ColorCode:
RED = 1
BLUE = 2
BLACK = 3
def print_color(color_code):
if color_code == ColorCode.RED:
print('红色')
elif color_code == ColorCode.BLUE:
print('蓝色')
elif color_code == ColorCode.BLACK:
print('黑色')
print_color(1)
函数里不再用color_code和1,2,3这些整数值进行比较,而是与ColorCode的类属性进行比较,代码可阅读性更好,因为只看1,2,3,你无法理解这些数字所代表的含义。虽然使用类可以模拟枚举类型,但这种技术有一个缺点,类属性可以随意修改。
Enum类型的应用
Python3 提供了enum模块,定义类时继承enum.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('黑色')
print_color(1)
看上去和第2小节里的代码没有什么大的区别,但由于继承了enum.Enum,ColorCode的类属性将无法修改,如果执行
ColorCode.RED = 4
将会引起异常
raise AttributeError('Cannot reassign members.')
AttributeError: Cannot reassign members.
枚举值唯一
为了防止定义枚举值时出现重复的值,enum模块还提供了unique装饰器,
import enum
from enum import unique
@unique
class ColorCode(enum.Enum):
RED = 1
BLUE = 1
BLACK = 3
如果枚举值出现了重复的情况,由于有unique装饰器修饰,因此在执行时会报错。
枚举值遍历
可以使用for循环对枚举值进行遍历
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
枚举值比较
枚举值之间不支持 > 和 < 操作,但支持等值比较和is身份比较