Fluent Python Notes: Data Model
私人筆記,有錯誤煩請指正
遵循Steve Holden的做法,在唸出Magic Functions的時候用dunder取代underscore, 如__getitem__
唸作”dunder-getitem”
善用namedtuple來建構裡面只有一堆屬性,沒有自訂方法的簡單類別,如資料庫的紀錄一般
註:
- nametuple是類別工廠,回傳一個tuple的子類別
- 呼叫屬性
asdict
回傳OrderedDict物件(3.6後版本) - 屬性是immutable(tuple),要更改可以re-create或呼叫
_replace
- 透過
__doc__
設定docstring - 透過
__default__
或prototype._replace
來設定預設值
實作__getitem__
讓物件變成可迭代物(iterable)
某個集合可以透過實作__contains__
來定義in運算子要如何掃描集合。
關於特殊方法,它們是要讓Python編譯器呼叫的,而不是你(私下呼叫);使用者程式經常呼叫的特殊方法只有__init__
,目的是呼叫你自己寫的__init__
;如果你要呼叫特殊方法,呼叫相關的內建函式會比較好(例如len、iter、str等),這些函式不僅會呼叫對應的特殊方法,通常還會提供其他服務,也比較快
__repr__
回傳的字串必須精確,而且如果可以的話,必須盡可能匹配原始碼,以重新建立被表示的物件;__str__
是讓print函式私下使用的,回傳給終端使用者觀看的格式;如果沒有自訂的__str__
可用,Python會呼叫__repr__
來提供回饋
https://stackoverflow.com/a/2626364/8100647
注意這裡的方法回傳新的Vector實例。為中綴(infix)運算子的預期行為:為了建立新的物件,並不接觸它們的運算元
len不會被當成方法來呼叫,因為它身為Python資料模型的一部分,會受到特殊對待,如同abs。但是拜特殊方法__len__
所賜,你的自訂物件也可以使用len,這是一種在內建物件效率與語言一致性之間取得的平衡