枚舉類定義和使用


一些具有特殊含義的類,其實例化對象的個數往往是固定的,比如用一個類表示月份,則該類的實例對象最多有 12 個;再比如用一個類表示季節,則該類的實例化對象最多有 4 個。

針對這種特殊的類,Python 3.4 中新增加了 Enum 枚舉類。也就是說,對於這些實例化對象個數固定的類,可以用枚舉類來定義。

例如,下面程序演示了如何定義一個枚舉類:

from enum import Enum
class Color(Enum):
    # 為序列值指定value值
    red = 1
    green = 2
    blue = 3

如果想將一個類定義為枚舉類,只需要令其繼承自 enum 模塊中的 Enum 類即可。例如在上面程序中,Color 類繼承自 Enum 類,則證明這是一個枚舉類。

在 Color 枚舉類中,red、green、blue 都是該類的成員(可以理解為是類變量)。注意,枚舉類的每個成員都由 2 部分組成,分別為 name 和 value,其中 name 屬性值為該枚舉值的變量名(如 red),value 代表該枚舉值的序號(序號通常從 1 開始)。

和普通類的用法不同,枚舉類不能用來實例化對象,但這並不妨礙我們訪問枚舉類中的成員。訪問枚舉類成員的方式有多種,例如以 Color 枚舉類為例,在其基礎上添加如下代碼:

#調用枚舉成員的 3 種方式
print(Color.red)
print(Color['red'])
print(Color(1))
#調取枚舉成員中的 value 和 name
print(Color.red.value)
print(Color.red.name)
#遍歷枚舉類中所有成員的 2 種方式
for color in Color:
    print(color)

程序輸出結果為:

Color.red
Color.red
Color.red
1
red
Color.red
Color.green
Color.blue


枚舉類成員之間不能比較打下,但可以用 == 或者 is 進行比較是否相等,例如:

print(Color.red == Color.green)
print(Color.red.name is Color.green.name)

輸出結果為:

Flase
Flase


需要注意的是,枚舉類中各個成員的值,不能在類的外部做任何修改,也就是說,下面語法的做法是錯誤的:

  1. Color.red = 4


除此之外,該枚舉類還提供了一個 __members__ 屬性,該屬性是一個包含枚舉類中所有成員的字典,通過遍歷該屬性,也可以訪問枚舉類中的各個成員。例如:

for name,member in Color.__members__.items():
    print(name,"->",member)

輸出結果為:

red -> Color.red
green -> Color.green
blue -> Color.blue


值得一提的是,Python 枚舉類中各個成員必須保證 name 互不相同,但 value 可以相同,舉個例子:

from enum import Enum

class Color(Enum):
    # 為序列值指定value值
    red = 1
    green = 1
    blue = 3
print(Color['green'])

輸出結果為:

Color.red

可以看到,Color 枚舉類中 red 和 green 具有相同的值(都是 1),Python 允許這種情況的發生,它會將 green 當做是 red 的別名,因此當訪問 green 成員時,最終輸出的是 red。

在實際編程過程中,如果想避免發生這種情況,可以借助 @unique 裝飾器,這樣當枚舉類中出現相同值的成員時,程序會報 ValueError 錯誤。例如:

#引入 unique
from enum import Enum,unique
#添加 unique 裝飾器
@unique
class Color(Enum):
    # 為序列值指定value值
    red = 1
    green = 1
    blue = 3
print(Color['green'])

運行程序會報錯:

Traceback (most recent call last):
  File "D:\python3.6\demo.py", line 3, in <module>
    class Color(Enum):
  File "D:\python3.6\lib\enum.py", line 834, in unique
    (enumeration, alias_details))
ValueError: duplicate values found in <enum 'Color'>: green -> red


除了通過繼承 Enum 類的方法創建枚舉類,還可以使用 Enum() 函數創建枚舉類。例如:

from enum import Enum
#創建一個枚舉類
Color = Enum("Color",('red','green','blue'))

#調用枚舉成員的 3 種方式
print(Color.red)
print(Color['red'])
print(Color(1))
#調取枚舉成員中的 value 和 name
print(Color.red.value)
print(Color.red.name)
#遍歷枚舉類中所有成員的 2 種方式
for color in Color:
    print(color)

Enum() 函數可接受 2 個參數,第一個用於指定枚舉類的類名,第二個參數用於指定枚舉類中的多個成員。

如上所示,僅通過一行代碼,即創建了一個和前面的 Color 類相同的枚舉類。運行程序,其輸出結果為:

Color.red
Color.red
Color.red
1
red
Color.red
Color.green
Color.blue


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM