Python中的枚舉類型示例介紹
起步
Python 的原生類型中并不包含枚舉類型。為了提供更好的解決方案,Python 通過 PEP 435 在 3.4 版本中添加了 enum 標準庫。
枚舉類型可以看作是一種標簽或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期、月份、狀態(tài)等。在沒有專門提供枚舉類型的時候我們是怎么做呢,一般就通過字典或類來實現(xiàn):
Color = {
'RED' : 1,
'GREEN': 2,
'BLUE' : 3,
}
class Color:
RED = 1
GREEN = 2
BLUE = 3
這種來實現(xiàn)枚舉如果小心翼翼地使用當然沒什么問題,畢竟是一種妥協(xié)的解決方案。它的隱患在于可以被修改。
使用 Enum
更好的方式是使用標準庫提供的 Enum 類型,官方庫值得信賴。3.4 之前的版本也可以通過 pip install enum 下載支持的庫。簡單的示例:
from enum import Enum class Color(Enum): red = 1 green = 2 blue = 3
枚舉成員有值(默認可重復),枚舉成員具有友好的字符串表示:
>>> print(Color.red) Color.red >>> print(repr(Color.red)) <Color.red: 1> >>> type(Color.red) <Enum 'Color'> >>> isinstance(Color.green, Color) True
枚舉類型不可實例化,不可更改。
定義枚舉
定義枚舉時,成員名不允許重復
class Color(Enum): red = 1 green = 2 red = 3 # TypeError: Attempted to reuse key: 'red'
成員值允許相同,第二個成員的名稱被視作第一個成員的別名
class Color(Enum): red = 1 green = 2 blue = 1 print(Color.red) # Color.red print(Color.blue) # Color.red print(Color.red is Color.blue)# True print(Color(1)) # Color.red 在通過值獲取枚舉成員時,只能獲取到第一個成員
若要不能定義相同的成員值,可以通過 unique 裝飾
from enum import Enum, unique @unique class Color(Enum): red = 1 green = 2 blue = 1 # ValueError: duplicate values found in <enum 'Color'>: blue -> red
枚舉取值
可以通過成員名來獲取成員也可以通過成員值來獲取成員:
print(Color['red']) # Color.red 通過成員名來獲取成員 print(Color(1)) # Color.red 通過成員值來獲取成員
每個成員都有名稱屬性和值屬性:
member = Color.red print(member.name) # red print(member.value) # 1
支持迭代的方式遍歷成員,按定義的順序,如果有值重復的成員,只獲取重復的第一個成員:
for color in Color: print(color)
特殊屬性 __members__ 是一個將名稱映射到成員的有序字典,也可以通過它來完成遍歷:
for color in Color.__members__.items():
print(color) # ('red', <Color.red: 1>)
枚舉比較
枚舉的成員可以通過 is 同一性比較或通過 == 等值比較:
Color.red is Color.red Color.red is not Color.blue Color.blue == Color.red Color.blue != Color.red
枚舉成員不能進行大小比較:
Color.red < Color.blue # TypeError: unorderable types: Color() < Color()
擴展枚舉 IntEnum
IntEnum 是 Enum 的擴展,不同類型的整數(shù)枚舉也可以相互比較:
from enum import IntEnum class Shape(IntEnum): circle = 1 square = 2 class Request(IntEnum): post = 1 get = 2 print(Shape.circle == 1) # True print(Shape.circle < 3) # True print(Shape.circle == Request.post) # True print(Shape.circle >= Request.post) # True
總結
enum 模塊功能很明確,用法也簡單,其實現(xiàn)的方式也值得學習,有機會的話可以看看它的源碼。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
Tensorflow:轉置函數(shù) transpose的使用詳解
今天小編就為大家分享一篇Tensorflow:轉置函數(shù) transpose的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Tensorflow中的placeholder和feed_dict的使用
這篇文章主要介紹了Tensorflow中的placeholder和feed_dict的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
使用pycallgraph分析python代碼函數(shù)調(diào)用流程以及框架解析
這篇文章主要介紹了使用pycallgraph分析python代碼函數(shù)調(diào)用流程以及框架解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
Pandas?DataFrame數(shù)據(jù)修改值的方法
本文主要介紹了Pandas?DataFrame修改值,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
PyQt5實現(xiàn)進度條與定時器及子線程同步關聯(lián)
這篇文章主要為大家詳細介紹了PyQt5如何實現(xiàn)進度條與定時器及子線程的同步關聯(lián),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-01-01

