2.20. 頭等公民¶
類別 將資料與作用於該資料的函式,歸納在單一名稱之下。當數項狀態彼此相關,且指令碼中大多數函式都以同一組值作為引數時,採用類別便有其價值。
2.20.1. class 關鍵字¶
關鍵字是 class。其主體包含一個 __init__ 方法,每次建立新實例時都會執行:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(3, 4)
print(p.x, p.y)
輸出:
3 4
Point 是類別;p 是它的一個 實例。呼叫 Point(3, 4) 時的括號會觸發 __init__,它將引數指派為新實例上的屬性。self 是實例的慣用名稱;self.x 設定一個屬性,供該實例其餘的方法讀取。
2.20.2. 何時使用類別¶
當以下情況同時成立時,便可考慮使用類別:
一小組相關的值在各處總是相伴出現(一個點的
x與y;一筆感測器讀數的值、單位與時間戳記)。數個函式接收同一組值並對它們進行操作。
同時讓多個這類組合保持存在、彼此區分,是有用的。
如果資料是一次性的,普通的 dict 或 tuple 通常就足夠了。如果只需要單一一組常數,使用模組層級變數即可。類別並非預設的容器 -- 唯有當狀態與行為想要緊密結合時,類別才有其用武之地。
2.20.3. __init__ 的作用¶
__init__ 只是一個普通的方法。在其中指派給 self 的任何東西,都會成為新實例上的屬性:
class Sensor:
def __init__(self, name, unit):
self.name = name
self.unit = unit
self.readings = []
temp = Sensor("temperature", "C")
print(temp.name, temp.unit, temp.readings)
輸出:
temperature C []
readings 被初始化為一個空 list -- 每個新實例都會擁有自己的 list,而非共用同一個。任何未指派給 self 的東西都只是 __init__ 的區域變數,並在它回傳時消失。