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。


分享到:


相關文章: