使用 slots 限制屬性
在 Python 的類別中,我們通常可以在實例化後隨意為物件添加屬性,但是有時候這可能會導致意外錯誤或浪費記憶體。為了解決這個問題,你可以使用 slots,來限制實例能擁有哪些屬性。
class Person:
slots = ['name', 'age']
def __init__(self, name, age):
self.name = name
self.age = age
在這裡,我們透過 slots 限定 Person 類別的實例只能擁有 name 和 age 這兩個屬性。如果你嘗試給這個物件添加一個未定義的屬性,像這樣:
p = Person("Alice", 30)
p.address = "123 Main St" # 這行會報錯
程式就會引發 AttributeError,告訴你不能隨便添加屬性。這樣一來,你的程式就會更加嚴謹,並且不會無意中浪費記憶體資源,特別是在大型應用中,slots 可以有效提升內存利用效率。
Dataclasses 簡化數據類定義
如果你經常需要為物件定義一堆屬性和方法,那麼你可能會覺得寫大量樣板代碼有點繁瑣。從 Python 3.7 開始,引入了 dataclass 裝飾器,讓我們可以快速定義一個數據類,省去很多重複的工作。dataclass 自動為我們生成了常用的 init 和 repr 等方法。
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
p = Point(1, 2)
print(p) #輸出:Point(x=1, y=2)
在這個例子中,我們定義了一個 Point 類別,這裡的 dataclass 自動幫我們生成了初始化方法(init)和物件表示方法(repr)。結果是你可以直接使用 Point 類別來創建物件,並能夠簡單地輸出這些物件的狀態,而無需自己寫那些樣板代碼。