23 枚舉 枚舉是一組符號名稱(枚舉成員)的集合,枚舉成員應該是唯一的、不可變的。 23.1 使用普通類實現枚舉類 class basicWeek(): SUN=0 MON=1 TUE=2 WED=3 THU=4 FRI=5 SAT=6 # 獲取值 print(basicWeek.SUN) # 0 ...
23 枚舉
枚舉是一組符號名稱(枚舉成員)的集合,枚舉成員應該是唯一的、不可變的。
23.1 使用普通類實現枚舉類
class basicWeek():
SUN=0
MON=1
TUE=2
WED=3
THU=4
FRI=5
SAT=6
# 獲取值
print(basicWeek.SUN) # 0
雖然這樣也可以實現,但不嚴謹,也不安全,原因如下所示:
- 枚舉類中,不允許存在相同的枚舉項(類變數)
- 不允許在類外面直接修改枚舉項的值
class basicWeek():
SUN=0
MON=1
TUE=2
WED=3
THU=4
FRI=5
SAT=6
SUN=7 # 這裡會覆蓋前面已經定義的值
# 獲取值
print(basicWeek.SUN) # 7
# 在外面修改值
basicWeek.SUN=99
# 再次獲取的值為修改後的值
print(basicWeek.SUN) # 99
為瞭解決這種問題,我們引入枚舉類
23.2 枚舉類
在Python中使用枚舉類,可以引入內置模塊Enum,如下所示:
from enum import Enum
class EnumWeek(Enum):
SUN = 0
MON=1
TUE=2
WED=3
THU=4
FRI=5
SAT=6
print(EnumWeek.SUN) # EnumWeek.SUN
print(type(EnumWeek.SUN)) # <enum 'EnumWeek'>
print(EnumWeek.SUN.value) # 0
print(EnumWeek(5)) # EnumWeek.FRI
print(type(EnumWeek.SUN.value)) # <class 'int'>
print(EnumWeek.SUN.value == 0) # True
print(EnumWeek.SUN == EnumWeek2.SUN) # False
print(EnumWeek.SUN == EnumWeek.SUN) # True
print(EnumWeek.SUN is EnumWeek2.SUN) # False
print(EnumWeek.SUN is EnumWeek.SUN) # True
使用枚舉類註意事項如下所示:
- 枚舉類不能用來實例化對象
- 訪問枚舉類中的項,直接使用類名.訪問項,如EnumWeek.SUN
- 枚舉類中定義的key=value,在類外部不允許修改
- 枚舉類可以用來==、is來進行比較
- 枚舉類允許有多個名稱作為某個相同值的別名
from enum import Enum
class EnumWeek(Enum):
SUN = 0
MON=1
TUE=2
WED=3
THU=4
FRI=5
SAT=0
print(EnumWeek.SAT) # EnumWeek.SUN
- 如果不允許枚舉類出現相同值的時,可以使用裝飾器@unique
from enum import Enum,unique
@unique
class EnumWeek(Enum):
SUN = 0
MON=1
TUE=2
WED=3
THU=4
FRI=5
SAT=0
輸出結果如下所示:
Traceback (most recent call last):
File "C:\Users\admin\Documents\PyCharmProjects\MyPythonProjects\LearningCode\LearningEnum.py", line 4, in <module>
class EnumWeek(Enum):
File "D:\Program Files\Python\lib\enum.py", line 1013, in unique
raise ValueError('duplicate values found in %r: %s' %
ValueError: duplicate values found in <enum 'EnumWeek'>: SAT -> SUN
- 使用自動設定的值
from enum import Enum,unique,auto
@unique
class EnumWeek(Enum):
SUN = auto()
MON=auto()
TUE=auto()
WED=auto()
THU=auto()
FRI=auto()
SAT=auto()
print(EnumWeek.SAT.value) # 7
print(EnumWeek.WED.value) # 4
- 枚舉類是允許迭代的
from enum import Enum,unique,auto
@unique
class EnumWeek(Enum):
SUN = auto()
MON=auto()
TUE=auto()
WED=auto()
THU=auto()
FRI=auto()
SAT=auto()
for week in EnumWeek:
print(f"week is {week}:{week.value}")
輸出結果如下所示:
week is EnumWeek.SUN:1
week is EnumWeek.MON:2
week is EnumWeek.TUE:3
week is EnumWeek.WED:4
week is EnumWeek.THU:5
week is EnumWeek.FRI:6
week is EnumWeek.SAT:7
原文地址:https://www.jianshu.com/p/391c9717525d
本文同步在微信訂閱號上發佈,如各位小伙伴們喜歡我的文章,也可以關註我的微信訂閱號:woaitest,或掃描下麵的二維碼添加關註:
作者: Surpassme
來源: http://www.jianshu.com/u/28161b7c9995/
http://www.cnblogs.com/surpassme/
聲明:本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出 原文鏈接 ,否則保留追究法律責任的權利。如有問題,可發送郵件 聯繫。讓我們尊重原創者版權,共同營造良好的IT朋友圈。