一、介紹
枚舉類可以方便地表示星期,月份等常數類型,如果你不用枚舉類,那么你只能用數字或者字符串。如果你使用數字,用1-7來表示星期數,但一個數字在程序中不僅可以表示星期數,可能還有其他許多含義,這樣你在寫程序時就必須時刻記住這些數字的含義,這降低了程序的可讀性,也導致容易出錯。而當你使用字符串時,雖然沒有明顯的缺點,但在內存中字符串所占內存要比數字多,這就降低了程序的效率。
枚舉類正好彌補了這兩方面的缺點,你可以在代碼中使用枚舉類,但在內存中存放時使用的是數字,既提高了可讀性,又提高了程序效率。更重要的是,Python中的枚舉類型是不可變類型,又可以進行迭代,這就意味着你可以隨時使用枚舉類型而不用擔心改變了枚舉類型的值
二、代碼
from enum import Enum, unique #@unique #@unique裝飾器可以幫助我們檢查保證沒有重復值 class Weekday(Enum): Sun = 0 # Sun的value被設定為0 Mon = 1 Tue = 2 Wed = 3 Thu = 4 Fri = 5 Sat = 6 Say = 6 #假設重復項 print(Weekday.Sun) #枚舉類型 print(Weekday['Sun']) #枚舉類型 print(Weekday.Sun.name) #枚舉名稱 print(Weekday.Sun.value) #枚舉值 print(Weekday(3)) #數字得到枚舉類型 # 遍歷枚舉,重復的不會打印 for w in Weekday: print(w) # 遍歷枚舉,重復的會打印 for name, member in Weekday.__members__.items(): print( name, member )
三、進階用法
from enum import Enum, unique @unique # @unique裝飾器可以幫助我們檢查保證沒有重復值 class Weekday(Enum): def __new__(cls, english, chinese, day): obj = object.__new__(cls) obj.english = english obj.chinese = chinese obj.day = day return obj Sun = 'Sunday', '星期日', 0 # Sun的value被設定為0 Mon = 'Monday', '星期一', 1 Tue = 'Tuesday', '星期二', 2 Wed = 'Wednesday', '星期三', 3 Thu = 'Thursday', '星期四', 4 Fri = 'Friday', '星期五', 5 Sat = 'Saturday', '星期六', 6 print(Weekday.Sun) # 枚舉類型 print(Weekday['Sun']) # 枚舉類型 print(Weekday.Sun.name) # 枚舉名稱 print(Weekday.Sun.value) # 枚舉值 print(Weekday.Sun._value_) # 也是枚舉值 print(Weekday.Sun.chinese) # 自定義枚舉中文名 print(Weekday.Sun.english) # 自定義枚舉英文名 print(Weekday( ('Wednesday', '星期三', 3))) # 這里注意,按照源碼中最后的判斷,if value in cls._value2member_map_: value就是傳入的值, # cls._value2member_map_就是包含__value__的一個字典,也就是枚舉的3個值,是一個整體的元組 @unique # @unique裝飾器可以幫助我們檢查保證沒有重復值 class Weekday(Enum): def __new__(cls, english, chinese, day): obj = object.__new__(cls) obj.english = english obj.chinese = chinese obj._value_ = day # 稍作修改 return obj Sun = 'Sunday', '星期日', 0 # Sun的value被設定為0 Mon = 'Monday', '星期一', 1 Tue = 'Tuesday', '星期二', 2 Wed = 'Wednesday', '星期三', 3 Thu = 'Thursday', '星期四', 4 Fri = 'Friday', '星期五', 5 Sat = 'Saturday', '星期六', 6 print(Weekday.Sun) # 枚舉類型 print(Weekday['Sun']) # 枚舉類型 print(Weekday.Sun.name) # 枚舉名稱 print(Weekday.Sun.value) # 枚舉值 print(Weekday.Sun._value_) # 也是枚舉值 print(Weekday.Sun.chinese) # 自定義枚舉中文名 print(Weekday.Sun.english) # 自定義枚舉英文名 print(Weekday(3)) #這樣也可以判斷了