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。
閱讀更多 趣喜歡編程 的文章