理解Python數據類(下)
雷鋒網按:本文為AI研習社編譯的技術博客,原標題 Understanding Python Dataclasses?—?Part 2 ,作者為 Shikhar Chauhan 。
翻譯 | 程添傑 整理 | MY
我們已經知道 Dataclasses 會生成他們自身的__init__方法。它同時把初始化的值賦給這些欄位。以下是我們在上一篇博客里定義的內容:
變數名
數據類型
這些內容僅給我們有限的 dataclass 欄位使用範圍。讓我們討論一下這些局限性,以及它們如何通過 dataclass.field 被解決。
複合初始化
考慮以下情形:你想要初始化一個變數為列表。你如何實現它呢?一種簡單的方式是使用__post_init__方法。
數據類 Student 產生了一個名為 marks 的列表。我們不傳遞 marks 的值,而是使用__post_init__方法初始化。這是我們定義的單一屬性。此外,我們必須在__post_init__里調用 get_random_marks 函數。這些工作是額外的。
辛運的是,Python 為我們提供了一個解決方案。我們可以使用 dataclasses.field 來定製化 dataclass 欄位的行為以及它們在 dataclass 的影響。
仍然是上述的使用情形,讓我們從__post_init__里去除 get_random_marks 的調用。以下是使用 dataclasses.field 的情形:
dataclasses.field 接受了一個名為 default_factory 的參數,它的作用是:如果在創建對象時沒有賦值,則使用該方法初始化該欄位。
default_factory 必須是一個可以調用的無參數方法(通常為一個函數)。
這樣我們就可以使用複合形式初始化欄位。現在,讓我們考慮另一個使用場景。
使用全部欄位進行數據比較
通過上篇博文,我們了解到,dataclass 能夠自動生成=這些比較方法。但是這些比較方法的一個缺陷是,它們使用類中的所有欄位進行比較,而這種情況往往不常見。更經常地,這種比較方法會給我們使用 dataclasses 造成麻煩。
考慮以下的使用情形:你有一個數據類用於存放用戶的信息。現在,它可能存在以下欄位:
姓名
年齡
身高
體重
......
※Arm與RISC-V互撕,但為何Arm先關閉攻擊網站?
※我們請了五位大咖,共赴 AI 醫學影像盛宴
TAG:雷鋒網 |