Skip to content

magic-function

Fluent Python Notes: Data Model

  • Python

私人筆記,有錯誤煩請指正

Fluent Python Github


遵循Steve Holden的做法,在唸出Magic Functions的時候用dunder取代underscore, 如__getitem__唸作”dunder-getitem”


善用namedtuple來建構裡面只有一堆屬性,沒有自訂方法的簡單類別,如資料庫的紀錄一般

註:

  1. nametuple是類別工廠,回傳一個tuple的子類別
  2. 呼叫屬性asdict回傳OrderedDict物件(3.6後版本)
  3. 屬性是immutable(tuple),要更改可以re-create或呼叫_replace
  4. 透過__doc__設定docstring
  5. 透過__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,這是一種在內建物件效率與語言一致性之間取得的平衡