當前位置:
首頁 > 知識 > Python3.7新特性:Data Class

Python3.7新特性:Data Class

Python3.7新特性:Data Class

介紹

Python 3.7 中有一個新特性, 你可以使用一個裝飾器 @dataclass來簡化創建數據類的過程,新創建的數據類將自帶有__init____repr__

數據類是一種用來存儲數據的類,這種類往往不需要自定義的方法。通常,我們也管它叫數據結構。例如,一個存儲點的三維坐標值的類,往往就只需要三個欄位 (x, y, z)。

然而,如果我們用以前的方式實現一個數據類,那我們不可避免地需要自己編寫一個__init__方法,一個字元串表示的內置方法,和一個比較函數等等。這些方法的邏輯顯而易見,如果語言能夠自動地處理,那就再好不過了。

事實上,其他一些語言,如 Kotlin,已經提供了構建數據類的便捷方式,Java也可以通過Lombok庫來使用 @Data標記構建數據類。

例子

這裡是使用dataclass的一個例子

Python3.7新特性:Data Class

默認情況下,裝飾器會自動生成初始化函數、比較函數和字元串表示函數。

換言之,上面代碼等同於下面的舊式代碼:

Python3.7新特性:Data Class

注意這個例子也可以使用 namedtuple完成,但是實現的代碼可讀性就差了很多,雖然確實比上面例子更短了:

Python3.7新特性:Data Class

DATACLASS參數

@dataclass裝飾器可以接受幾個參數來控制自動生成的方法的行為:

Python3.7新特性:Data Class

  • init: 如果 True, 生成__init__方法。

  • repr: 如果 True, 生成__repr__方法。

  • eq: 如果 True, 生成__eq__方法,比較邏輯就是把數據當作一個元組來比較。

  • order: 如果 True, 生成__lt__,__le__,__gt__, 和__ge__方法。

  • unsafe_hash: 如果 False, 依據eqfrozen的值生成__hash__方法。 如果 True,生成__hash__方法。

  • frozen: 如果 True, 生成的對象就是不可變的 (只讀).

欄位配置

dataclasses模塊中, 有一個field函數,它可以用來做欄位級別的配置:

Python3.7新特性:Data Class

通過它你可以控制一個欄位的默認值, 該欄位是否應該顯示在 __repr__中,是否應該被比較函數忽略,是否應該計算在__hash__中, 等等。

Python3.7新特性:Data Class

初始化後處理

生成的 __init__代碼會調用一個叫__post_init__的函數。 如果你需要依據基礎數據生成一些衍生數據,那麼這個函數會很有用。 注意如果__init__方法沒有生成, 那麼__post_init__也不會執行。

其他DATACLASS方法

dataclasses 模塊還提供了很多其他的有用的函數:

  • fields: 返回Field對象的元組。 一個Field對象包含一個欄位的配置。

  • asdict: 將數據類實例轉換為對應欄位的字典。

  • astuple: 將數據類實例轉換為對應欄位的元組。

  • make_dataclass: 動態創建一個數據類。

  • replace: 拷貝數據類實例,並修改部分欄位。

  • is_dataclass: 判斷一個對象是否是指定數據類的對象。

英文原文:https://www.codingame.com/playgrounds/37245/python-dataclass

譯者:詩書塞外

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

Python設計模式
Web緩存投毒實戰

TAG:Python部落 |