本篇文章帶給大家的內容是關於Python中枚舉類型的詳解(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
Python 的原生類型中並不包含枚舉類型。為了提供更好的解決方案,Python 透過 PEP 435 在 3.4 版本中加入了 enum 標準函式庫。
枚舉類型可以看作是一種標籤或是一系列常數的集合,通常用於表示某些特定的有限集合,例如星期、月份、狀態等。在沒有專門提供枚舉類型的時候我們是怎麼做呢,一般就透過字典或類別來實現:
Color = { 'RED' : 1, 'GREEN': 2, 'BLUE' : 3, } class Color: RED = 1 GREEN = 2 BLUE = 3
這種來實現枚舉如果小心翼翼地使用當然沒什麼問題,畢竟是一種妥協的解決方案。它的隱憂在於可以被修改。
使用 Enum
更好的方式是使用標準函式庫提供的 Enum
類型,官方函式庫值得信賴。 3.4 之前的版本也可以透過 pip install enum
下載支援的函式庫。簡單的範例:
from enum import Enum class Color(Enum): red = 1 green = 2 blue = 3
枚舉成員有值(預設可重複),而枚舉成員具有友善的字串表示:
>>> print(Color.red) Color.red >>> print(repr(Color.red)) <Color.red: 1> >>> type(Color.red) <Enum 'Color'> >>> isinstance(Color.green, Color) True
枚舉類型不可實例化,不可變更。
定義枚舉
定義枚舉時,成員名稱不允許重複
class Color(Enum): red = 1 green = 2 red = 3 # TypeError: Attempted to reuse key: 'red'
成員值允許相同,第二個成員的名稱被視為第一個成員的別名
class Color(Enum): red = 1 green = 2 blue = 1 print(Color.red) # Color.red print(Color.blue) # Color.red print(Color.red is Color.blue)# True print(Color(1)) # Color.red 在通过值获取枚举成员时,只能获取到第一个成员
若要無法定義相同的成員值,可以透過unique 裝飾
from enum import Enum, unique @unique class Color(Enum): red = 1 green = 2 blue = 1 # ValueError: duplicate values found in <enum 'Color'>: blue -> red
#枚舉取值
可以透過成員名稱來取得成員也可以透過成員值來取得成員:
print(Color['red']) # Color.red 通过成员名来获取成员 print(Color(1)) # Color.red 通过成员值来获取成员
每個成員都有名稱屬性和值屬性:
member = Color.red print(member.name) # red print(member.value) # 1
支援迭代的方式遍歷成員,依定義的順序,如果有值重複的成員,只取得重複的第一個成員:
for color in Color: print(color)
特殊屬性__members__
是一個將名稱對應到成員的有序字典,也可以透過它來完成遍歷:
for color in Color.__members__.items(): print(color) # ('red', <Color.red: 1>)
#枚舉比較
枚舉的成員可以透過is
同一性比較或透過==
等值比較:
Color.red is Color.red Color.red is not Color.blue Color.blue == Color.red Color.blue != Color.red
枚舉成員不能進行大小比較:
Color.red < Color.blue # TypeError: unorderable types: Color() < Color()
#擴充枚舉IntEnum
IntEnum 是Enum 的擴展,不同類型的整數枚舉也可以互相比較:
from enum import IntEnum class Shape(IntEnum): circle = 1 square = 2 class Request(IntEnum): post = 1 get = 2 print(Shape.circle == 1) # True print(Shape.circle < 3) # True print(Shape.circle == Request.post) # True print(Shape.circle >= Request.post) # True
總結
enum 模組功能很明確,用法也簡單,其實現的方式也值得學習,有機會的話可以看看它的源碼。
#以上是Python中枚舉類型的詳解(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!