天天看點

python裝飾器class_Python裝飾器dataclass詳解

引言

Dataclasses 是一些适合于存儲資料對象(data object)的 Python類。你可能會問,什麼是資料對象?下面是一個并不詳盡的用于定義資料對象的特征清單:

他們存儲并表示特定的資料類型。例如:一個數字。對于那些熟悉對象關系映射(Object Relational Mapping,簡稱 ORM)的人來說,一個模型執行個體就是一個資料對象。它表示了一種特定類型的實體。它存儲了用于定義或表示那種實體的屬性。

他們能夠被用于和同類型的其他對象進行比較。例如,一個數字可能大于,小于或等于另一個數字。

當然資料對象還有更多的特征,但上述内容足以幫助你了解關鍵部分。

為了了解 Dataclasses,我們将實作一個簡單的類。它能夠存儲一個數字,并允許我們執行上面提到的各種運算。

首先,我們将使用普通的類,然後我們使用 Dataclasses 來實作相同的結果。

但是在我們開始之前,還是要提一下 Dataclasses 的用法。

Python3.7 提供了一個裝飾器dataclass,用以把一個類轉化為 dataclass。

你需要做的就是把類包裹進裝飾器裡:

python裝飾器class_Python裝飾器dataclass詳解

現在,讓我們進一步了解 dataclass 的用法,以及它能為我們改變什麼。

初始化

python裝飾器class_Python裝飾器dataclass詳解
python裝飾器class_Python裝飾器dataclass詳解

以下是使用了 dataclass裝飾器之後的變化:

1. 不必定義__init__然後再指派給 self, 裝飾器會注意這一點

2.我們用一種更可讀的方式定義成員屬性,并帶有類型提示(type hinting)。我們現在立刻就知道 val 的類型是 int。這種方式當然比通常的定義方法可讀性更好。

Python 之道:可讀性很重要

也可以定義預設值:

對象表示是一種對象的字元串表示法,在調試時非常有用。

預設的 Python 對象表示不是非常的有用:

python裝飾器class_Python裝飾器dataclass詳解

這種表示法不能給我們對象用途的提示,同時将導緻可怕的調試經曆。

一種有意義的表示法可以通過在類定義裡,添加一種__repr__方法實作。

現在我們就有了一種有意義的對象表示法:

dataclass 會自動添加一個__repr__函數,是以我們不必手動實作它了。

python裝飾器class_Python裝飾器dataclass詳解

資料比較

通常,資料對象會伴随着互相比較的需要。兩個對象'a'和'b'之間通常包含以下的運算:

a < b

a > b

a == b

a >= b

a <= b

在 Python 裡,可以通過在類中定義一些方法來實作上述運算。為了保證整篇文章的簡潔性,我将隻實作 == 和 < 。