一些具有特殊含義的類,其實例化物件的個數往往是固定的,比如用乙個類表示月份,則該類的例項物件最多有 12 個;再比如用乙個類表示季節,則該類的例項化物件最多有 4 個。
針對這種特殊的類,python 3.4 中新增加了 enum 列舉類。也就是說,對於這些例項化物件個數固定的類,可以用列舉類來定義。
例如,下面程式演示了如何定義乙個列舉類:
from enum import enum
class
color
(enum)
:# 為序列值指定value值
red =
1 green =
2 blue =
3
如果想將乙個類定義為列舉類,只需要令其繼承自 enum 模組中的 enum 類即可。例如在上面程式中,color 類繼承自 enum 類,則證明這是乙個列舉類。
在 color 列舉類中,red、green、blue 都是該類的成員(可以理解為是類變數)。注意,列舉類的每個成員都由 2 部分組成,分別為 name 和 value,其中 name 屬性值為該列舉值的變數名(如 red),value 代表該列舉值的序號(序號通常從 1 開始)。
和普通類的用法不同,列舉類不能用來例項化物件,但這並不妨礙我們訪問列舉類中的成員。訪問列舉類成員的方式有多種,例如以 color 列舉類為例,在其基礎上新增如下**:
'''
'''#呼叫列舉成員的 3 種方式
print
(color.red)
print
(color[
'red'])
print
(color(1)
)#調取列舉成員中的 value 和 name
print
(color.red.value)
print
(color.red.name)
#遍歷列舉類中所有成員的 2 種方式
for color in color:
print
(color)
程式輸出結果為:
color.red
color.red
color.red
1red
color.red
color.green
color.blue
列舉類成員之間不能比較打下,但可以用 == 或者 is 進行比較是否相等,例如:
'''
'''print
(color.red == color.green)
print
(color.red.name is color.green.name)
輸出結果為:
flase
flase
需要注意的是,列舉類中各個成員的值,不能在類的外部做任何修改,也就是說,下面語法的做法是錯誤的:
color.red =
4
除此之外,該列舉類還提供了乙個 __ members __ 屬性,該屬性是乙個包含列舉類中所有成員的字典,通過遍歷該屬性,也可以訪問列舉類中的各個成員。例如:
for name,member in color.__members__.items():
print
(name,
"->"
,member)
輸出結果為:
red -
> color.red
green -
> color.green
blue -
> color.blue
值得一提的是,python 列舉類中各個成員必須保證 name 互不相同,但 value 可以相同,舉個例子:
'''
'''from enum import enum
class
color
(enum)
:# 為序列值指定value值
red =
1 green =
1 blue =
3print
(color[
'green'])
輸出結果為:
color.red
可以看到,color 列舉類中 red 和 green 具有相同的值(都是 1),python 允許這種情況的發生,它會將 green 當做是 red 的別名,因此當訪問 green 成員時,最終輸出的是 red。
在實際程式設計過程中,如果想避免發生這種情況,可以借助 @unique 裝飾器,這樣當列舉類**現相同值的成員時,程式會報 valueerror 錯誤。例如:
#引入 unique
from enum import enum,unique
#新增 unique 裝飾器
@unique
class
color
(enum)
:# 為序列值指定value值
red =
1 green =
1 blue =
3print
(color[
'green'
])
執行程式會報錯:
traceback (most recent call last)
: file "d:\python3.6\demo.py"
, line 3,in
class
color
(enum)
: file "d:\python3.6\lib\enum.py"
, line 834
,in unique
(enumeration, alias_details)
)valueerror: duplicate values found in
>
: green -
> red
除了通過繼承 enum 類的方法建立列舉類,還可以使用 enum() 函式建立列舉類。例如:
'''
'''from enum import enum
#建立乙個列舉類
color = enum(
"color",(
'red'
,'green'
,'blue'))
#呼叫列舉成員的 3 種方式
print
(color.red)
print
(color[
'red'])
print
(color(1)
)#調取列舉成員中的 value 和 name
print
(color.red.value)
print
(color.red.name)
#遍歷列舉類中所有成員的 2 種方式
for color in color:
print
(color)
enum() 函式可接受 2 個引數,第乙個用於指定列舉類的類名,第二個引數用於指定列舉類中的多個成員。
如上所示,僅通過一行**,即建立了乙個和前面的 color 類相同的列舉類。執行程式,其輸出結果為:
color.red
color.red
color.red
1red
color.red
color.green
color.blue
python 使用列舉類
當我們需要定義常量時,乙個辦法是用大寫變數通過整數來定義,例如月份 jan 1 feb 2 mar 3 nov 11 dec 12好處是簡單,缺點是型別是int,並且仍然是變數。更好的方法是為這樣的列舉型別定義乙個class型別,然後,每個常量都是class的乙個唯一例項。python提供了enum...
python類的定義和使用
python 類的使用。1.使用乙個名為 init 的方法來完成初始化。2.使用乙個名為 del 的方法來完成類似析購操作。3.所有的例項方法都擁有乙個 self 引數來傳遞當前例項,類似於 this。1 usr bin python 2 decoding gbk 3 4import sys 5 6...
python 定義和使用時鐘類
import time import os class clock object python中的函式是沒有過載的概念的 因為python中函式的引數沒有型別而且支援預設引數和可變引數 用關鍵字引數讓構造器可以傳入任意多個引數來實現其他語言中的構造器重載 def init self,kw if ho...