Python 的列舉型別

2021-09-13 01:31:25 字數 2884 閱讀 7338

python 的原生型別中並不包含列舉型別。為了提供更好的解決方案,python 通過 pep 435 在 3.4 版本中新增了enum標準庫。

列舉型別可以看作是一種標籤或是一系列常量的集合,通常用於表示某些特定的有限集合,例如星期、月份、狀態等。在沒有專門提供列舉型別的時候我們是怎麼做呢,一般就通過字典或類來實現:

color = 

class color:

red = 1

green = 2

blue = 3

這種來實現列舉如果小心翼翼地使用當然沒什麼問題,畢竟是一種妥協的解決方案。它的隱患在於可以被修改。

from enum import enum

class color(enum):

red = 1

green = 2

blue = 3

列舉成員有值(預設可重複),列舉成員具有友好的字串表示:

>>> print(color.red)

color.red

>>> print(repr(color.red))

>>> type(color.red)

>>> 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 : 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', )

列舉的成員可以通過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()
intenumenum的擴充套件,不同型別的整數列舉也可以相互比較:

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模組功能很明確,用法也簡單,其實現的方式也值得學習,有機會的話可以看看它的原始碼。

Python 的列舉型別

python 的原生型別中並不包含列舉型別。為了提供更好的解決方案,python 通過 pep 435 在 3.4 版本中新增了enum標準庫。列舉型別可以看作是一種標籤或是一系列常量的集合,通常用於表示某些特定的有限集合,例如星期 月份 狀態等。在沒有專門提供列舉型別的時候我們是怎麼做呢,一般就通...

Python 的列舉型別

python 的原生型別中並不包含列舉型別。為了提供更好的解決方案,python 通過 pep 435 在 3.4 版本中新增了enum標準庫。列舉型別可以看作是一種標籤或是一系列常量的集合,通常用於表示某些特定的有限集合,例如星期 月份 狀態等。在沒有專門提供列舉型別的時候我們是怎麼做呢,一般就通...

Python 的列舉型別

python 的原生型別中並不包含列舉型別。為了提供更好的解決方案,python 通過 pep 435 在 3.4 版本中新增了enum標準庫。列舉型別可以看作是一種標籤或是一系列常量的集合,通常用於表示某些特定的有限集合,例如星期 月份 狀態等。在沒有專門提供列舉型別的時候我們是怎麼做呢,一般就通...