使用列舉類

2021-07-11 13:47:28 字數 1869 閱讀 8439

當我們需要定義常量時,乙個辦法是用大寫變數通過整數來定義,例如月份:

jan = 1

feb = 2

mar = 3

...nov = 11

dec = 12

好處是簡單,缺點是型別是int,並且仍然是變數。

更好的方法是為這樣的列舉型別定義乙個class型別,然後,每個常量都是class的乙個唯一例項。python提供了enum類來實現這個功能:

from enum import enum

month = enum('month', ('jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'))

這樣我們就獲得了month型別的列舉類,可以直接使用month.jan來引用乙個常量,或者列舉它的所有成員:

for name, member in month.__members__.items():

print(name, '=>', member, ',', member.value)

value屬性則是自動賦給成員的int常量,預設從1開始計數。

如果需要更精確地控制列舉型別,可以從enum派生出自定義類:

from enum import enum, unique

@unique

class weekday(enum):

sun = 0 # sun的value被設定為0

mon = 1

tue = 2

wed = 3

thu = 4

fri = 5

sat = 6

@unique裝飾器可以幫助我們檢查保證沒有重複值。

訪問這些列舉型別可以有若干種方法:

>>> day1 = weekday.mon

>>> print(day1)

weekday.mon

>>> print(weekday.tue)

weekday.tue

>>> print(weekday['tue'])

weekday.tue

>>> print(weekday.tue.value)

2>>> print(day1 == weekday.mon)

true

>>> print(day1 == weekday.tue)

false

>>> print(weekday(1))

weekday.mon

>>> print(day1 == weekday(1))

true

>>> weekday(7)

traceback (most recent call last):

...valueerror: 7 is not a valid weekday

>>> for name, member in weekday.__members__.items():

... print(name, '=>', member)

...sun => weekday.sun

mon => weekday.mon

tue => weekday.tue

wed => weekday.wed

thu => weekday.thu

fri => weekday.fri

sat => weekday.sat

可見,既可以用成員名稱引用列舉常量,又可以直接根據value的值獲得列舉常量。

小結enum可以把一組相關常量定義在乙個class中,且class不可變,而且成員可以直接比較。

列舉類及其使用

一 列舉類的使用 列舉類的理解 類的物件只有有限個,確定的。我們稱此類為列舉類 當需要定義一組常量時,強烈建議使用列舉類 如果列舉類中只有乙個物件,則可以作為單例模式的實現方式 public class seasontest 自定義列舉類 class season 3.提供當前列舉類的多個物件 pu...

列舉類的使用

類的物件只有有限個,確定的,我們稱之為列舉類。例如 星期,執行緒狀態,性別,季節等。當需要定義一組常量時,強烈建議使用列舉類 如果列舉類中只有乙個物件,則可以作為乙個單例模式的實現方式 方式一 jdk 1.5 之前,自定義列舉類 自定義列舉類 class season public string g...

python 使用列舉類

當我們需要定義常量時,乙個辦法是用大寫變數通過整數來定義,例如月份 jan 1 feb 2 mar 3 nov 11 dec 12好處是簡單,缺點是型別是int,並且仍然是變數。更好的方法是為這樣的列舉型別定義乙個class型別,然後,每個常量都是class的乙個唯一例項。python提供了enum...