新聞中心
在Python中,枚舉和我們?cè)趯?duì)象中定義的類(lèi)變量時(shí)一樣的,每一個(gè)類(lèi)變量就是一個(gè)枚舉項(xiàng),下面為大家詳細(xì)講解一下Python枚舉。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶(hù)創(chuàng)新互聯(lián)還提供了綏陽(yáng)免費(fèi)建站歡迎大家使用!
枚舉類(lèi)實(shí)例:
#調(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)
如果想將一個(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è)例子:
#引入 unique
from enum import Enum,unique
#添加 unique 裝飾器
@unique
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 class Color(Enum): File “D:\python3.6\lib\enum.py”, line 834, in unique (enumeration, alias_details)) ValueError: duplicate values found in : 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
當(dāng)前文章:詳解Python枚舉
文章地址:http://www.fisionsoft.com.cn/article/dphoipd.html


咨詢(xún)
建站咨詢(xún)
