python3 枚举
1. 枚举类型
当一个变量有几种固定的取值时,通常我们喜欢将它定义为枚举类型,枚举类型用于声明一组命名的常数,使用枚举类型可以增强代买的可读性。在python2中,没有枚举这种数据类型,开发人员不得不使用其他手段来构造出近似于枚举类型的数据结构,从python3开始,python正式提供了枚举类型。
2. 枚举应用场景
假设有这样一个函数
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,你无法理解这些数字所代表的含义。虽然使用类可以模拟枚举类型,但这种技术有一个缺点,类属性可以随意修改
ColorCode.RED = 4
枚举类型要求一旦完成定义,就不能再修改,否则使用枚举的地方将由于枚举值的改变出现不可知的问题。
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.
4. 枚举值
4.1 枚举值唯一
为了防止定义枚举值时出现重复的值,enum模块还提供了unique装饰器
import enum
from enum import unique
@unique
class ColorCode(enum.Enum):
RED = 1
BLUE = 1
BLACK = 3
如果枚举值出现了重复的情况,由于有unique装饰器修饰,因此在执行时会报错。
4.2 枚举值遍历
使用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
4.3 枚举值比较
枚举值之间不支持 > 和 < 操作,但支持等值比较和is身份比较