實際開發中,咱們離不開定義各類類型,當咱們須要定義類型時,通常是經過一組整數來定義。好比:定義不一樣的月份python
JAN 1
FEB 2
MAR 3
...
NOV 11
DEC 12
複製代碼
大多數人想到如下幾種定義的方法:安全
1.直接使用定義變量的方法bash
jan = 1
feb = 2
複製代碼
2.使用字典spa
d = {"jan": 1, "feb": 2}
複製代碼
3.使用類變量code
class TypeMonth:
jan = 1
feb = 2
複製代碼
對於表示月份的數字或者其餘類型,一旦定義以後就不須要做改變!可是以上幾種定義的方法,都能輕易的對類型的值進行改變,好比:cdn
d['jan'] = 3
TypeMonth.jan = 3
複製代碼
這在實際開發中是不嚴謹的,也不安全,是不可取的。 同時,以上幾種方法都會出現不一樣的類型 key,相同值的狀況。對象
d = {"jan": 1, "feb": 2, "mar": 2}
複製代碼
對於這種狀況,在 Python3.4 以後,給咱們增長了枚舉類,枚舉類型能夠看做是一種標籤或是一系列常量的集合,一般用於表示某些特定的有限集合,例如星期、月份、狀態等blog
簡單示例:繼承
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
print(Color.RED)
輸出結果: Color.RED
複製代碼
上面的代碼建立了一個基本的枚舉示例,與咱們普通類不一樣,它繼承 Enum 這個類。同時使用類獲取屬性的時候,輸出的不是它的數值,而是會顯示枚舉項。這樣更能增長代碼的可讀性。開發
對比普通的類,它有如下優點: ####不容許在類外直接修改枚舉項的值。
咱們能夠嘗試修改枚舉中標籤的值,
Color.RED = 4
複製代碼
運行以後,會報錯,
在枚舉類中存在相同的 key 值也是不容許的,好比下面代碼有兩個相同的 RED
class Color(Enum):
RED = 1
RED = 1
GREEN = 2
BLUE = 3
複製代碼
運行以後,會提示類型錯誤。
在枚舉類中,能夠有相同值,可是後面的枚舉項都是第一個的別名
class Color(Enum):
RED = 1
GREEN = 1
BLUE = 3
print(Color.GREEN)
輸出結果:Color.RED
複製代碼
從結果中能夠看到,輸出的是 Color.RED 這個類型,而不是 Color.GREEN。 若是你不想讓枚舉類中有相同的 value 值,Enum 也提供了的相應的處理方法
from enum import Enum
from enum import unique
@unique
class Color(Enum):
RED = 1
GREEN = 1
BLUE = 3
print(Color.GREEN)
複製代碼
運行以後,代碼會提示 ValueError
Color.GREEN.value
複製代碼
Color.GREEN.name
複製代碼
for v in Color:
print(v)
輸出結果:
Color.RED
Color.GREEN
Color.BLUE
複製代碼
對於有相同 value 值的枚舉類進行遍歷
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
BLACK = 1
for v in Color:
print(v)
輸出結果:
Color.RED
Color.GREEN
Color.BLUE
複製代碼
能夠看到,相同值的標籤名稱不會被輸出。若是要輸出,要使用如下方法遍歷
for k, v in Color.__members__.items():
print(k, v)
輸出結果:
RED Color.RED
GREEN Color.GREEN
BLUE Color.BLUE
BLACK Color.RED
複製代碼
result = Color.RED == Color.GREEN
print(result)
輸出結果: False
複製代碼
同時支持 is 身份比較
result = Color.RED is Color.BLACK
print(result)
輸出結果: True
複製代碼
由於 RED 和 BLACK 的 value 值是相等的
枚舉之間不支持 '>' 或 '<' 比較,好比下面的代碼就會報錯
result = Color.RED > Color.BLACK
複製代碼
枚舉最大的好處,就是增長了咱們代碼的可讀性
if a ==1:
pass
elif a == 2:
pass
複製代碼
上面代碼可讀性就不好,由於咱們並不知道 一、2 所表明的含義。可是若是有枚舉類就不同了。
if a == Color.RED.value:
pass
elif a == Color.GREEN.value:
pass
複製代碼
相比第一份代碼,後面的代碼可讀性就好不少了。那麼若是咱們怎麼將枚舉的值轉換成枚舉名稱呢? 好比 a = 1,直接將該變量傳入枚舉類便可
a = 1
print(Color(a))
輸出結果:
Color.RED
複製代碼
1.枚舉類不能用來實例化對象
2.訪問枚舉類中的某一項,直接使用類名訪問加上要訪問的項便可,好比 color.RED
3.枚舉類裏面定義的 Key = Value,在類外部不能修改 Value 值
4.枚舉項能夠用來比較,使用 ==,或者 is
5.枚舉類中的 Key 不能相同,Value 能夠相同,可是 Value 相同的各項 Key 都會當作別名
6.枚舉類能夠用 for 進行遍歷,members.items() 能夠遍歷出含有別名的類
7.若是要枚舉類中的 value 也不能相同,須要導入 unique 對枚舉類進行裝飾