Python 模块 enum 定义了枚举类型(enumeration type),它有迭代(iteration)和比较的能力。
创建
创建枚举类型就是新建一个类,继承自 enum.Enum。添加一些属性和值。
上面的代码定义了订单状态类 OrderStatus,继承自 enum.Enum。然后定义了一些属性值。
输出:
查看输出,OrderStatus 的每个属性都转变为 <enum> 枚举实例。/<enum>
name 和 value 分别对应枚举实例的成员名称和分配给它的值。
迭代
可以用 for in 迭代枚举类型,查看每个枚举实例。
输出:
遍历获取到的每个枚举实例,分别输出 name 和 value 的值。遍历的属性的顺序就是类定义时声明的顺序。
比较
因为声明枚举成员是没有顺序的,他们支持按值(equality)比较和按身份(identity)比较。
输出:
排序
输出:
使用 sorted() 函数排序枚举实例 enum.Enum 时,抛出错误 TypeError,提示 OrderStatus() 不可排序。
使用 IntEnum 类支持类成员的排序,他们按整数值比较。
现在类 OrderStatus 继承 enum.IntEnum 类,定义了4个属性。调用 sorted() 函数按照属性值排序,输出 name 值。
输出:
唯一值
默认 Enum 允许定义重复值,重复的属性相当于别名,他们都指向同一个枚举实例,遍历的时候不会重复出现。
输出:
因为 OrderStatus.init 和 OrderStatus.confirm 值都是1,他们指向同一个实例,所以他们相等。最后 confirm 和 init 没有重复出现。
如果不想要有重复值,添加装饰器 @enum.unique 在类定义上方。
输出:
代码触发了异常 ValueError,提示发现了重复值 init 和 confirm。
以编程方式定义枚举
在有的情况下,以编程的方式创建枚举更方便。Enum 支持通过构造函数传入成员名称和值。
输出:
enum.Enum 的 value 参数定义了枚举类型名称,names 参数是一个字符串,列出了枚举的成员名称,用空格或者逗号分隔,起始值为1。
如果想指定成员的值,需要传递一个元组或者字典的序列。
输出:
这个例子中,names 指定了一个元组序列,每个元组有两个元素,分别代表成员名称和值。
枚举成员值也可以不是整数
枚举成员值不限制非得是一个整数,例如可以是一个元组,元组中每个元素的成员名称可以通过 __init__ 函数传入。查看下面的例子:
输出:
在这个例子中,枚举类的每个成员都是一个元组类型,元组的第一个值是整数 code,第二个是一个列表 ops。
通过 __init__ 方法实例化每个成员值。然后就可以通过点操作符访问枚举实例的 code 和 ops 属性。
下面例子,介绍了枚举成员是字典的情况:
输出:
如果枚举成员值是字典,那么 __init__ 方法接收的参数类型是字典。
上面的例子,迭代了 OrderStatus 的所有实例,分别输出了属性 code 和 ops。
閱讀更多 趣喜歡編程 的文章