-
1 # qzuser264129631
-
2 # lanfengz3
列舉型別可以看作是一種標籤或是一系列常量的集合,通常用於表示某些特定的有限集合,例如星期、月份、狀態等。Python 的原生型別(Built-in types)裡並沒有專門的列舉型別,但是我們可以透過很多方法來實現它,例如字典、類等:
WEEKDAY = {
"MON": 1,
"TUS": 2,
"WEN": 3,
"THU": 4,
"FRI": 5
}
class Color:
RED = 0
GREEN = 1
BLUE = 2
上面兩種方法可以看做是簡單的列舉型別的實現,如果只在區域性範圍內用到了這樣的列舉變數是沒有問題的,但問題在於它們都是可變的(mutable),也就是說可以在其它地方被修改從而影響其正常使用:
WEEKDAY["MON"] = WEEKDAY["FRI"]
print(WEEKDAY)
{"FRI": 5, "TUS": 2, "MON": 5, "WEN": 3, "THU": 4}
透過類定義的列舉甚至可以例項化,變得不倫不類:
c = Color()
print(c.RED)
Color.RED = 2
print(c.RED)
0
2
當然也可以使用不可變型別(immutable),例如元組,但是這樣就失去了列舉型別的本意,將標籤退化為無意義的變數:
COLOR = ("R", "G", "B")
print(COLOR[0], COLOR[1], COLOR[2])
R G B
為了提供更好的解決方案,Python 透過 PEP 435 在 3.4 版本中添加了 enum 標準庫,3.4 之前的版本也可以透過 pip install enum 下載相容支援的庫。enum 提供了 Enum/IntEnum/unique 三個工具,用法也非常簡單,可以透過繼承 Enum/IntEnum 定義列舉型別,其中 IntEnum 限定列舉成員必須為(或可以轉化為)整數型別,而 unique 方法可以作為修飾器限定列舉成員的值不可重複:
from enum import Enum, IntEnum, unique
try:
@unique
class WEEKDAY(Enum):
MON = 1
TUS = 2
WEN = 3
THU = 4
FRI = 1
except ValueError as e:
print(e)
duplicate values found in : FRI -> MON
try:
class Color(IntEnum):
RED = 0
GREEN = 1
BLUE = "b"
except ValueError as e:
print(e)
invalid literal for int() with base 10: "b"
回覆列表
在面向物件程式設計,類(英語:class)是一種面向物件計算機程式語言的構造,是建立物件的藍圖,描述了所建立的物件共同的屬性和方法。
類的更嚴格的定義是由某種特定的元資料所組成的內聚的包。它描述了一些物件的行為規則,而這些物件就被稱為該類的例項。類有介面和結構。介面描述瞭如何透過方法與類及其例項互操作,而結構描述了一個例項中資料如何劃分為多個屬性。類是與某個層
[1]的物件的最具體的型別。類還可以有執行時表示形式(元物件),它為操作與類相關的元資料提供了執行時支援。支援類的程式語言在支援與類相關的各種特性方面都多多少少有一些微妙的差異。大多數都支援不同形式的類繼承。許多語言還支援提供封裝性的特性,比如訪問修飾符。類的出現,為面向物件程式設計的三個最重要的特性(封裝性,繼承性,多型性),提供了實現的手段。
在現實世界中,經常有屬於同一個類的物件。例如,某輛腳踏車只是世界上很多腳踏車中的一輛。在面向物件軟體中,也有很多共享相同特徵的不同的物件:矩形、僱用記錄、影片剪輯等。可以利用這些物件的相同特徵為它們建立一個藍圖。物件的軟體藍圖稱為類。
類是定義同一類所有物件的變數和方法的藍圖或原型。例如,可以建立一個定義包含當前檔位等例項變數的腳踏車類。這個類也定義和提供了例項方法(變檔、剎車)的實現。
例項變數的值由類的每個例項提供。因此,當建立腳踏車類以後,必須在使用之前對它進行例項化。當建立類的例項時,就建立了這種型別的一個物件,然後系統為類定義的例項變數分配記憶體。然後可以呼叫物件的例項方法實現一些功能。相同類的例項共享相同的例項方法。
除了例項變數和方法,類也可以定義類變數和類方法。可以從類的例項中或者直接從類中訪問類變數和方法。類方法只能操作類變數 - 不必訪問例項變數或例項方法。
系統在第一次在程式中遇到一個類時為這個類建立它的所有類變數的複製 - 這個類的所有例項共享它的類變數。
物件和類的說明其實很相似。實際上,類和物件之間的差別經常是一些困惑的起源。在現實世界中很明顯,類不是它描述的物件 - 腳踏車的藍圖不是腳踏車。但是在軟體中就有點難區分類和物件。這部分是由於軟體物件只是現實世界的電子模型或抽象概念。但是也由於很多人用“物件”指類和它們的例項這兩者。