詳解Python中的枚舉類型
你好,我是 征哥,今天分享一下 Python 中的枚舉類型,為什么需要枚舉類型,及如何使用。
什么是枚舉類型
枚舉(Enum)是一種數(shù)據(jù)類型,是綁定到唯一值的符號表示。您可以使用它來創(chuàng)建用于變量和屬性的常量集。它們類似于全局變量,但是,它們提供了更有用的功能,例如分組和類型安全。Python 在 3.4 版本中添加了標(biāo)準(zhǔn)庫 enum。
為什么要使用枚舉
使用枚舉有以下好處:
代碼更容易閱讀,更容易維護(hù)。
減少由轉(zhuǎn)換或錯誤輸入引起的 bug。
使將來修改值變得更容易。
如何使用枚舉
以我們最熟悉的性別為例,先創(chuàng)建一個枚舉類型:
>>>?from?enum?import?Enum >>>?class?Gender(Enum): ...?????男?=?1 ...?????女?=?0 ...?????未知?=?2 ... >>>?Gender <enum?'Gender'>
訪問枚舉:
>>>?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 '未知'
接下來,讓我們先看看不使用枚舉的版本,然后再看看使用枚舉的版本,這樣就知道枚舉的好處了。
以汽車銷售為例,我們需要根據(jù)不同國家的稅率來計算汽車的出售價格。不使用枚舉的版本如下:
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
接下來,我們來看一看使用枚舉版本的代碼:
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ù)增加出口的國家地區(qū),也非常簡單,只需要增加一個枚舉類型,創(chuàng)建一個新的 Car 對象,需求修改 Car 類的任何代碼:
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)
訪問枚舉的三種方式:
print(StateTax['CN']) print(StateTax.CN) print(StateTax(0.03))?#通過 value 來訪問
最后的話
枚舉 (Enum) 是綁定到唯一值的符號。我們可以通過定義一個繼承自 Enum 的類來創(chuàng)建枚舉,使用 enum[member_name] 通過名稱訪問 Enum 成員,也可以通過并通過 enum(member_value) 訪問,還可以通過 enum.member_name 來訪問。Enum 可以幫助我們使代碼更具可讀性,更具可維護(hù)性,推薦大家都用一用。
到此這篇關(guān)于詳解Python中的枚舉類型的文章就介紹到這了,更多相關(guān)Python枚舉類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python opencv將多個圖放在一個窗口的實(shí)例詳解
這篇文章主要介紹了python opencv將多個圖放在一個窗口,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02基于Python實(shí)現(xiàn)的車牌識別系統(tǒng)
本文將以基于Python的車牌識別系統(tǒng)實(shí)現(xiàn)為方向,介紹車牌識別技術(shù)的基本原理、常用算法和方法,并詳細(xì)講解如何利用Python語言實(shí)現(xiàn)一個完整的車牌識別系統(tǒng),需要的朋友可以參考下2023-10-10python3的url編碼和解碼,自定義gbk、utf-8的例子
今天小編就為大家分享一篇python3的url編碼和解碼,自定義gbk、utf-8的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08python實(shí)現(xiàn)TCPserver的使用示例
python實(shí)現(xiàn)TCPserver是一件簡單的事情,只要通過socket這個模塊就可以實(shí)現(xiàn),本文就來介紹一下python實(shí)現(xiàn)TCPserver的使用示例,感興趣的可以了解一下2023-10-10python實(shí)現(xiàn)aes加密及pycryptodome庫使用
AES算法是高級加密標(biāo)準(zhǔn),它是一種對稱加密算法,AES只有一個密鑰,這個密鑰既用來加密,也用于解密,這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)aes加密及pycryptodome庫使用的相關(guān)資料,需要的朋友可以參考下2023-10-10django 外鍵創(chuàng)建注意事項(xiàng)說明
這篇文章主要介紹了django 外鍵創(chuàng)建注意事項(xiàng)說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05