06.20 Python 枚举类型 Enum

Python 枚举类型 Enum

Python 模块 enum 定义了枚举类型(enumeration type),它有迭代(iteration)和比较的能力。

创建


创建枚举类型就是新建一个类,继承自 enum.Enum。添加一些属性和值。

Python 枚举类型 Enum

上面的代码定义了订单状态类 OrderStatus,继承自 enum.Enum。然后定义了一些属性值。

输出:

Python 枚举类型 Enum

查看输出,OrderStatus 的每个属性都转变为 <enum> 枚举实例。/<enum>

name 和 value 分别对应枚举实例的成员名称和分配给它的值。

迭代


可以用 for in 迭代枚举类型,查看每个枚举实例。

Python 枚举类型 Enum

输出:

Python 枚举类型 Enum

遍历获取到的每个枚举实例,分别输出 name 和 value 的值。遍历的属性的顺序就是类定义时声明的顺序。

比较


因为声明枚举成员是没有顺序的,他们支持按值(equality)比较和按身份(identity)比较。

Python 枚举类型 Enum

输出:

Python 枚举类型 Enum

排序


Python 枚举类型 Enum

输出:

Python 枚举类型 Enum

使用 sorted() 函数排序枚举实例 enum.Enum 时,抛出错误 TypeError,提示 OrderStatus() 不可排序。

使用 IntEnum 类支持类成员的排序,他们按整数值比较。

Python 枚举类型 Enum

现在类 OrderStatus 继承 enum.IntEnum 类,定义了4个属性。调用 sorted() 函数按照属性值排序,输出 name 值。

输出:

Python 枚举类型 Enum

唯一值


默认 Enum 允许定义重复值,重复的属性相当于别名,他们都指向同一个枚举实例,遍历的时候不会重复出现。

Python 枚举类型 Enum

输出:

Python 枚举类型 Enum

因为 OrderStatus.init 和 OrderStatus.confirm 值都是1,他们指向同一个实例,所以他们相等。最后 confirm 和 init 没有重复出现。

如果不想要有重复值,添加装饰器 @enum.unique 在类定义上方。

Python 枚举类型 Enum

输出:

Python 枚举类型 Enum

代码触发了异常 ValueError,提示发现了重复值 init 和 confirm。

以编程方式定义枚举


在有的情况下,以编程的方式创建枚举更方便。Enum 支持通过构造函数传入成员名称和值。

Python 枚举类型 Enum

输出:

Python 枚举类型 Enum

enum.Enum 的 value 参数定义了枚举类型名称,names 参数是一个字符串,列出了枚举的成员名称,用空格或者逗号分隔,起始值为1。

如果想指定成员的值,需要传递一个元组或者字典的序列。

Python 枚举类型 Enum

输出:

Python 枚举类型 Enum

这个例子中,names 指定了一个元组序列,每个元组有两个元素,分别代表成员名称和值。

枚举成员值也可以不是整数


枚举成员值不限制非得是一个整数,例如可以是一个元组,元组中每个元素的成员名称可以通过 __init__ 函数传入。查看下面的例子:

Python 枚举类型 Enum

输出:

Python 枚举类型 Enum

在这个例子中,枚举类的每个成员都是一个元组类型,元组的第一个值是整数 code,第二个是一个列表 ops。

通过 __init__ 方法实例化每个成员值。然后就可以通过点操作符访问枚举实例的 code 和 ops 属性。

下面例子,介绍了枚举成员是字典的情况:

Python 枚举类型 Enum

输出:

Python 枚举类型 Enum

如果枚举成员值是字典,那么 __init__ 方法接收的参数类型是字典。

上面的例子,迭代了 OrderStatus 的所有实例,分别输出了属性 code 和 ops。


分享到:


相關文章: