Python 類練習:建構一個小型物件模型
從一個小的記錄開始,類會更容易理解。先讓物件儲存幾個欄位,加一個方法,測試通過後再增加行為。
從藍圖開始
類把資料和行為組合在一起。建立物件時會執行 __init__,給屬性賦初始值。第一版要小:兩個欄位就足夠看清模式。
class Order:
def __init__(self, drink, price):
self.drink = drink
self.price = price
order = Order("latte", 4.5)
print(order.drink, order.price)兩個欄位的類
添加方法
方法就是類裡的函式,第一個參數是 self,指向目前物件。在實例上呼叫方法;不需要手動傳入 self。
class Order:
def __init__(self, drink, price, quantity=1):
self.drink = drink
self.price = price
self.quantity = quantity
def total(self):
return self.price * self.quantity
print(Order("latte", 4.5, 2).total())計算總價
保持實例獨立
每個物件都有自己的屬性。建立第二個 Order 不會覆蓋第一個。需要處理多條記錄時,把物件放進列表,用同一個迴圈處理。
class Order:
def __init__(self, drink, price):
self.drink = drink
self.price = price
orders = [Order("latte", 4.5), Order("tea", 3.0)]
for order in orders:
print(order.drink, order.price)多個獨立物件
把重複計算放進方法
如果每個呼叫者都要重複同一個公式,就把它放進方法。方法名說明了意圖,計算也只有一個地方需要修改。
class Order:
def __init__(self, price, quantity):
self.price = price
self.quantity = quantity
def total(self):
return self.price * self.quantity
print(Order(4.5, 3).total())公式只寫一次
知道什麼時候字典就夠了
類不是必須的。只是傳遞固定記錄時,字典可能更簡單。當狀態和行為確實屬於一起,或同樣的操作反覆出現時,再引入類。
order = {"drink": "latte", "price": 4.5}
print(order["drink"])
print(order["price"] * 2)字典替代方案
你的練習清單
- 定義 __init__,第一個參數是 self。
- 用 self.name = value 賦屬性。
- 在實例上呼叫方法,而不是在類上呼叫。
- 先寫一個小類,再考慮繼承。
常見問題
self 是什麼?
self 是呼叫方法時使用的實例。Python 會自動傳入它,所以呼叫者不需要提供。
每個程式都需要類嗎?
不需要。簡單記錄用字典,計算用函式。資料和行為確實屬於一起時,類才有價值。
為什麼會提示缺少參數?
方法定義時漏了 self,或呼叫時缺少必需參數,都可能造成這個錯誤。檢查方法籤名和呼叫。
練習類
12 道題,覆蓋 __init__、self、屬性、方法和獨立實例。
繼續閱讀: