1. 程式人生 > >Python學習筆記__7.5章 使用枚舉類

Python學習筆記__7.5章 使用枚舉類

編程語言 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、把Studentgender屬性改造為枚舉類型,可以避免使用字符串:

# -*- 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章 使用枚舉類