溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python枚舉類怎么定義和使用

發(fā)布時(shí)間:2022-05-20 11:31:05 來(lái)源:億速云 閱讀:131 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容主要講解“Python枚舉類怎么定義和使用”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Python枚舉類怎么定義和使用”吧!

一些具有特殊含義的類,其實(shí)例化對(duì)象的個(gè)數(shù)往往是固定的,比如用一個(gè)類表示月份,則該類的實(shí)例對(duì)象最多有 12 個(gè);再比如用一個(gè)類表示季節(jié),則該類的實(shí)例化對(duì)象最多有 4 個(gè)。

針對(duì)這種特殊的類,Python 3.4 中新增加了 Enum 枚舉類。也就是說(shuō),對(duì)于這些實(shí)例化對(duì)象個(gè)數(shù)固定的類,可以用枚舉類來(lái)定義。

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

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

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

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

和普通類的用法不同,枚舉類不能用來(lái)實(shí)例化對(duì)象,但這并不妨礙我們?cè)L問(wèn)枚舉類中的成員。訪問(wèn)枚舉類成員的方式有多種,例如以 Color 枚舉類為例,

在其基礎(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)
#遍歷枚舉類中所有成員的 2 種方式
for color in Color:
print(color)

程序輸出結(jié)果為:

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

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

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

輸出結(jié)果為:

Flase
Flase

需要注意的是,枚舉類中各個(gè)成員的值,不能在類的外部做任何修改,也就是說(shuō),下面語(yǔ)法的做法是錯(cuò)誤的:

Color.red = 4

除此之外,該枚舉類還提供了一個(gè)__members__屬性,該屬性是一個(gè)包含枚舉類中所有成員的字典,通過(guò)遍歷該屬性,也可以訪問(wèn)枚舉類中的各個(gè)成員。

例如:

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

輸出結(jié)果為:

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

值得一提的是,Python 枚舉類中各個(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 枚舉類中 red 和 green 具有相同的值(都是 1),Python 允許這種情況的發(fā)生,它會(huì)將 green 當(dāng)做是 red 的別名,因此當(dāng)訪問(wèn) green 成員時(shí),最終輸出的是 red。

在實(shí)際編程過(guò)程中,如果想避免發(fā)生這種情況,可以借助 @unique 裝飾器,這樣當(dāng)枚舉類中出現(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 類的方法創(chuàng)建枚舉類,還可以使用 Enum() 函數(shù)創(chuàng)建枚舉類。

例如:

from enum import Enum
#創(chuàng)建一個(gè)枚舉類
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)
#遍歷枚舉類中所有成員的 2 種方式
for color in Color:
print(color)

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

如上所示,僅通過(guò)一行代碼,即創(chuàng)建了一個(gè)和前面的 Color 類相同的枚舉類。

運(yùn)行程序,其輸出結(jié)果為:

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

到此,相信大家對(duì)“Python枚舉類怎么定義和使用”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI