Python枚舉類(lèi)定義和使用方法
前言:
一些具有特殊含義的類(lèi),其實(shí)例化對(duì)象的個(gè)數(shù)往往是固定的,比如用一個(gè)類(lèi)表示月份,則該類(lèi)的實(shí)例對(duì)象最多有 12 個(gè);再比如用一個(gè)類(lèi)表示季節(jié),則該類(lèi)的實(shí)例化對(duì)象最多有 4 個(gè)。
針對(duì)這種特殊的類(lèi),Python 3.4 中新增加了 Enum 枚舉類(lèi)。也就是說(shuō),對(duì)于這些實(shí)例化對(duì)象個(gè)數(shù)固定的類(lèi),可以用枚舉類(lèi)來(lái)定義。
例如,下面程序演示了如何定義一個(gè)枚舉類(lèi):
from enum import Enum class Color(Enum): # 為序列值指定value值 red = 1 green = 2 blue = 3
如果想將一個(gè)類(lèi)定義為枚舉類(lèi),只需要令其繼承自 enum 模塊中的 Enum 類(lèi)即可。例如在上面程序中,Color 類(lèi)繼承自 Enum 類(lèi),則證明這是一個(gè)枚舉類(lèi)。
在 Color 枚舉類(lèi)中,red、green、blue 都是該類(lèi)的成員(可以理解為是類(lèi)變量)。注意,枚舉類(lèi)的每個(gè)成員都由 2 部分組成,分別為 name 和 value,其中 name 屬性值為該枚舉值的變量名(如 red),value 代表該枚舉值的序號(hào)(序號(hào)通常從 1 開(kāi)始)。
和普通類(lèi)的用法不同,枚舉類(lèi)不能用來(lái)實(shí)例化對(duì)象,但這并不妨礙我們?cè)L問(wèn)枚舉類(lèi)中的成員。訪問(wèn)枚舉類(lèi)成員的方式有多種,例如以 Color 枚舉類(lèi)為例,
在其基礎(chǔ)上添加如下代碼:
#調(diào)用枚舉成員的 3 種方式 print(Color.red) print(Color['red']) print(Color(1)) #調(diào)取枚舉成員中的 value 和 name print(Color.red.value) print(Color.red.name) #遍歷枚舉類(lèi)中所有成員的 2 種方式 for color in Color: print(color)
程序輸出結(jié)果為:
Color.red
Color.red
Color.red
1
red
Color.red
Color.green
Color.blue
枚舉類(lèi)成員之間不能比較打下,但可以用 == 或者 is 進(jìn)行比較是否相等,例如
print(Color.red == Color.green) print(Color.red.name is Color.green.name)
輸出結(jié)果為:
Flase
Flase
需要注意的是,枚舉類(lèi)中各個(gè)成員的值,不能在類(lèi)的外部做任何修改,也就是說(shuō),下面語(yǔ)法的做法是錯(cuò)誤的:
Color.red = 4
除此之外,該枚舉類(lèi)還提供了一個(gè)??__members__?
?屬性,該屬性是一個(gè)包含枚舉類(lèi)中所有成員的字典,通過(guò)遍歷該屬性,也可以訪問(wèn)枚舉類(lèi)中的各個(gè)成員。
例如:
for name,member in Color.__members__.items(): print(name,"->",member)
輸出結(jié)果為:
red -> Color.red
green -> Color.green
blue -> Color.blue
值得一提的是,Python 枚舉類(lèi)中各個(gè)成員必須保證 name 互不相同,但 value 可以相同
舉個(gè)例子:
from enum import Enum class Color(Enum): # 為序列值指定value值 red = 1 green = 1 blue = 3 print(Color['green'])
輸出結(jié)果為:
Color.red
可以看到,Color 枚舉類(lèi)中 red 和 green 具有相同的值(都是 1),Python 允許這種情況的發(fā)生,它會(huì)將 green 當(dāng)做是 red 的別名,因此當(dāng)訪問(wèn) green 成員時(shí),最終輸出的是 red。
在實(shí)際編程過(guò)程中,如果想避免發(fā)生這種情況,可以借助 @unique 裝飾器,這樣當(dāng)枚舉類(lèi)中出現(xiàn)相同值的成員時(shí),程序會(huì)報(bào) ValueError 錯(cuò)誤。
例如:
#引入 unique from enum import Enum,unique #添加 unique 裝飾器 @unique class Color(Enum): # 為序列值指定value值 red = 1 green = 1 blue = 3 print(Color['green'])
運(yùn)行程序會(huì)報(bào)錯(cuò):
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
除了通過(guò)繼承 Enum 類(lèi)的方法創(chuàng)建枚舉類(lèi),還可以使用 Enum() 函數(shù)創(chuàng)建枚舉類(lèi)。
例如:
from enum import Enum #創(chuàng)建一個(gè)枚舉類(lèi) Color = Enum("Color",('red','green','blue')) #調(diào)用枚舉成員的 3 種方式 print(Color.red) print(Color['red']) print(Color(1)) #調(diào)取枚舉成員中的 value 和 name print(Color.red.value) print(Color.red.name) #遍歷枚舉類(lèi)中所有成員的 2 種方式 for color in Color: print(color)
Enum() 函數(shù)可接受 2 個(gè)參數(shù),第一個(gè)用于指定枚舉類(lèi)的類(lèi)名,第二個(gè)參數(shù)用于指定枚舉類(lèi)中的多個(gè)成員。
如上所示,僅通過(guò)一行代碼,即創(chuàng)建了一個(gè)和前面的 Color 類(lèi)相同的枚舉類(lèi)。
運(yùn)行程序,其輸出結(jié)果為:
Color.red
Color.red
Color.red
1
red
Color.red
Color.green
Color.blue
到此這篇關(guān)于Python枚舉類(lèi)定義和使用方法的文章就介紹到這了,更多相關(guān)Python 枚舉 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)對(duì)變位詞的判斷方法
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)對(duì)變位詞的判斷方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04使用python查找windows系統(tǒng)中所有程序的安裝信息
這篇文章主要為大家介紹了使用python查找windows系統(tǒng)中所有程序的安裝信息示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Python pip安裝第三方庫(kù)實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Python pip安裝第三方庫(kù)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07python 實(shí)現(xiàn)提取log文件中的關(guān)鍵句子,并進(jìn)行統(tǒng)計(jì)分析
今天小編就為大家分享一篇python 實(shí)現(xiàn)提取log文件中的關(guān)鍵句子,并進(jìn)行統(tǒng)計(jì)分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12python單例模式的應(yīng)用場(chǎng)景實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于python單例模式的應(yīng)用場(chǎng)景實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-02-02python UDF 實(shí)現(xiàn)對(duì)csv批量md5加密操作
這篇文章主要介紹了python UDF 實(shí)現(xiàn)對(duì)csv批量md5加密操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01Python學(xué)習(xí)之魔法函數(shù)(filter,map,reduce)詳解
這篇文章我們將來(lái)學(xué)習(xí)一下,Python中的三個(gè)高級(jí)函數(shù):filter()、map()、reduce(),這三個(gè)函數(shù)也被稱(chēng)為魔法函數(shù),感興趣的小伙伴可以了解一下2022-04-04