標籤:程式設計語言 Python
# 這是學習廖雪峰老師python教程的學習筆記
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章 使用枚舉類