Python枚舉類型Enum用法詳解

實際開發中,咱們離不開定義各類類型,當咱們須要定義類型時,通常是經過一組整數來定義。好比:定義不一樣的月份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 相同的枚舉項(類變量)

在枚舉類中存在相同的 key 值也是不容許的,好比下面代碼有兩個相同的 RED

class Color(Enum):
    RED = 1
    RED = 1
    GREEN = 2
    BLUE = 3
複製代碼

運行以後,會提示類型錯誤。

枚舉能夠相同的值,可是值相同的各項 Key 都會當作別名

在枚舉類中,能夠有相同值,可是後面的枚舉項都是第一個的別名

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 對枚舉類進行裝飾

相關文章
相關標籤/搜索