Python學習筆記__7.5章 使用枚舉類
1、概覽
當我們需要定義有規律的常量時,比如月份。我們可以用Enum類來實現這個功能
1.1、直接使用Enum類
from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
>>> type(Month)
<class 'enum.EnumMeta'>
定義了一個枚舉類型的Month類,其中每個常量都是Month類的一個唯一實例。
# 枚舉Month的所有成員
for name, member in Month.__members__.items():
print(name, '=>', member, ',', member.value)
Jan => Month.Jan , 1
Feb => Month.Feb , 2
…
參數分析:
name:Month中的每個常量名
member:Month中的每個實例
member.value:value屬性則是自動賦給成員的int常量,默認從1開始計數
# 使用
>>> Month.Jan # 直接引用一個常量,比如使用Month.Jan
<Month.Jan: 1>
>>> Month(1) # 通過value值來顯示
<Month.Jan: 1>
# 看下Month的內部結構
>>> list(Month) # 我們可以看到,Month內部,每個實例和value組成了鍵值對
[<Month.Jan: 1>, <Month.Feb: 2>, <Month.Mar: 3>, <Month.Apr: 4>, <Month.May: 5>,
<Month.Jun: 6>, <Month.Jul: 7>, <Month.Aug: 8>, <Month.Sep: 9>, <Month.Oct: 10>
, <Month.Nov: 11>, <Month.Dec: 12>]
註:Month裏的鍵值對是由Enum('Month', ('Jan',…)裏的Month,Jane,value,共同組合而成。例如
>>> Gender=Enum('gender',('Male','Female'))
>>> list(Gender)
[<gender.Male: 1>, <gender.Female: 2>]
1.2、從Enum派生出自定義類
如果需要更精確地控制枚舉類型,可以從Enum派生出自定義類使用
from enum import Enum, unique
@unique # @unique裝飾器可以幫助我們檢查保證沒有重復值
class Weekday(Enum):
Sun = 0 # 自定義Value值
Mon = 1
Tue = 2
Wed = 3
Thu = 4
Fri = 5
Sat = 6
參數分析:
常量名:Sun,Mon,…
實例:Weekday.Sun,Weekday.Mon,…
Value值:0,1,2,…
# Weekday的結構
>>> list(Weekday)
[<Weekday.Sun: 0>, <Weekday.Mon: 1>, <Weekday.Tue: 2>, <Weekday.Wed: 3>, <Weekda
y.Thu: 4>, <Weekday.Fri: 5>, <Weekday.Sat: 6>]
# print(實例) 和 直接使用實例 的區別
>>> print(Weekday.Tue) # print,只顯示實例名
Weekday.Tue
>>> Weekday.Tue # 直接使用實例,顯示鍵值對
<Weekday.Tue: 2>
>>> print(Weekday(1))
Weekday.Mon
>>> Weekday(1)
<Weekday.Mon: 1>
1.3、總結
既可以用成員名稱引用枚舉常量【Month.Jan】,又可以直接根據value的值獲得枚舉常量【Month(1)】
2、例子
1、把Student的gender屬性改造為枚舉類型,可以避免使用字符串:
# -*- coding: utf-8 -*-
from enum import Enum, unique
方法一:使用Enum的派生類
class Gender(Enum):
Male = 0
Female = 1
方法二:直接使用Enum
Gender = Enum('Gender', ('Male', 'Female'))
class Student(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
# 測試:
bart = Student('Bart', Gender.Male)
if bart.gender == Gender.Male:
print('測試通過!')
else:
print('測試失敗!')
Python學習筆記__7.5章 使用枚舉類