詳解Python中的枚舉類(lèi)型
你好,我是 征哥,今天分享一下 Python 中的枚舉類(lèi)型,為什么需要枚舉類(lèi)型,及如何使用。
什么是枚舉類(lèi)型
枚舉(Enum)是一種數(shù)據(jù)類(lèi)型,是綁定到唯一值的符號(hào)表示。您可以使用它來(lái)創(chuàng)建用于變量和屬性的常量集。它們類(lèi)似于全局變量,但是,它們提供了更有用的功能,例如分組和類(lèi)型安全。Python 在 3.4 版本中添加了標(biāo)準(zhǔn)庫(kù) enum。
為什么要使用枚舉
使用枚舉有以下好處:
代碼更容易閱讀,更容易維護(hù)。
減少由轉(zhuǎn)換或錯(cuò)誤輸入引起的 bug。
使將來(lái)修改值變得更容易。
如何使用枚舉
以我們最熟悉的性別為例,先創(chuàng)建一個(gè)枚舉類(lèi)型:
>>>?from?enum?import?Enum >>>?class?Gender(Enum): ...?????男?=?1 ...?????女?=?0 ...?????未知?=?2 ... >>>?Gender <enum?'Gender'>
訪問(wèn)枚舉:
>>>?for?g?in?Gender: ...?????print(g.name,g.value) ... 男?1 女?0 未知?2 >>>?print(Gender.男.name) 男 >>>?print(Gender.男.value) 1 >>>?isinstance(Gender.男,Gender) True >>>?Gender['男'] <Gender.男:?1> >>>?Gender['男'].value 1 >>>?Gender['男'].name '男' >>>?Gender(2).name '未知'
接下來(lái),讓我們先看看不使用枚舉的版本,然后再看看使用枚舉的版本,這樣就知道枚舉的好處了。
以汽車(chē)銷(xiāo)售為例,我們需要根據(jù)不同國(guó)家的稅率來(lái)計(jì)算汽車(chē)的出售價(jià)格。不使用枚舉的版本如下:
from?dataclasses?import?dataclass
@dataclass
class?Car:
????model:?str
????price:?float
????registraion_state:?str
????def?total_cost(self)?->?float:
????????match?self.registraion_state:
????????????case?"OR":
????????????????return??self.price?+?(self.price?*?0.05)
????????????case?"WA":
????????????????return??self.price?+?(self.price?*?0.10)
????????????case?"CA":
????????????????return??self.price?+?(self.price?*?0.08)
????????????case?_:
????????????????raise?TypeError("Invalid?registraion_state?value")
car1?=?Car(model="RAV4",?price=30000,?registraion_state="OR")
car2?=?Car(model="RAV4",?price=30000,?registraion_state="WA")
car3?=?Car(model="RAV4",?price=30000,?registraion_state="CA")
print(car1.total_cost())
print(car2.total_cost())
print(car3.total_cost())
代碼共 26 行,用 3.10 版本運(yùn)行結(jié)果如下:
31500.0
33000.0
32400.0
接下來(lái),我們來(lái)看一看使用枚舉版本的代碼:
from?dataclasses?import?dataclass from?enum?import?Enum class?StateTax(Enum): ????OR?=?0.05 ????WA?=?0.10 ????CA?=?0.08 @dataclass class?Car: ????model:?str ????price:?float ????tax:?StateTax ????def?total_cost(self)?->?float: ????????return??self.price?+?(self.price?*?self.tax.value)??????? ???? ????def?get_tax(self): ????????return?self.tax.value car1?=?Car(model="RAV4",?price=30000,?tax=StateTax.OR) car2?=?Car(model="RAV4",?price=30000,?tax=StateTax.WA) car3?=?Car(model="RAV4",?price=30000,?tax=StateTax.CA) print(car1.total_cost()) print(car2.total_cost()) print(car3.total_cost())
代碼共 28 行,運(yùn)行結(jié)果不變,但是代碼更優(yōu)雅,更容易閱讀了。而且后續(xù)增加出口的國(guó)家地區(qū),也非常簡(jiǎn)單,只需要增加一個(gè)枚舉類(lèi)型,創(chuàng)建一個(gè)新的 Car 對(duì)象,需求修改 Car 類(lèi)的任何代碼:
class?StateTax(Enum): ????OR?=?0.05 ????WA?=?0.10 ????CA?=?0.08 ????CN?=?0.03 car4?=?Car(model="RAV4",?price=30000,?tax=StateTax.CN)
從字典創(chuàng)建枚舉
from?enum?import?Enum
tax?=?{
????'OR':?0.05,
????'WA':?0.10,
????'CA':?0.08,
????'CN':?0.03
}
StateTax?=?Enum('tax',?tax)
訪問(wèn)枚舉的三種方式:
print(StateTax['CN']) print(StateTax.CN) print(StateTax(0.03))?#通過(guò) value 來(lái)訪問(wèn)
最后的話
枚舉 (Enum) 是綁定到唯一值的符號(hào)。我們可以通過(guò)定義一個(gè)繼承自 Enum 的類(lèi)來(lái)創(chuàng)建枚舉,使用 enum[member_name] 通過(guò)名稱(chēng)訪問(wèn) Enum 成員,也可以通過(guò)并通過(guò) enum(member_value) 訪問(wèn),還可以通過(guò) enum.member_name 來(lái)訪問(wèn)。Enum 可以幫助我們使代碼更具可讀性,更具可維護(hù)性,推薦大家都用一用。
到此這篇關(guān)于詳解Python中的枚舉類(lèi)型的文章就介紹到這了,更多相關(guān)Python枚舉類(lèi)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用python實(shí)現(xiàn)語(yǔ)音文件的特征提取方法
今天小編就為大家分享一篇使用python實(shí)現(xiàn)語(yǔ)音文件的特征提取方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
python多線程性能測(cè)試之快速mock數(shù)據(jù)
這篇文章主要為大家介紹了python多線程性能測(cè)試之快速mock數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
解決Django transaction進(jìn)行事務(wù)管理踩過(guò)的坑
這篇文章主要介紹了解決Django transaction進(jìn)行事務(wù)管理踩過(guò)的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
詳解Python openpyxl庫(kù)的基本應(yīng)用
這篇文章主要介紹了Python openpyxl庫(kù)的基本應(yīng)用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-02-02
python實(shí)現(xiàn)上傳樣本到virustotal并查詢掃描信息的方法
這篇文章主要介紹了python實(shí)現(xiàn)上傳樣本到virustotal并查詢掃描信息的方法,是比較實(shí)用的技巧,需要的朋友可以參考下2014-10-10

