中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

理解Python數(shù)據(jù)類:Dataclass 的特征概述 (上)

2018-08-16    來源:raincent

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

原標題Understanding Python Dataclasses?—?Part 1,作者為 Shikhar Chauhan 。

 

 

這是一個包含兩部分的博文:

這一篇是 Dataclass 的特征概述
下一篇是 Dataclass fields 的概述

引言

Dataclasses 是一些適合于存儲數(shù)據(jù)對象(data object)的 Python 類。你可能會問,什么是數(shù)據(jù)對象?下面是一個并不詳盡的用于定義數(shù)據(jù)對象的特征列表:

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

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

•   當(dāng)然數(shù)據(jù)對象還有更多的特征,但上述內(nèi)容足以幫助你理解關(guān)鍵部分。

•   為了理解 Dataclases,我們將實現(xiàn)一個簡單的類。它能夠存儲一個數(shù)字,并允許我們執(zhí)行上面提到的各種運算。

首先,我們將使用普通的類,然后我們使用 Dataclasses 來實現(xiàn)相同的結(jié)果。

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

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

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

 

 

現(xiàn)在,讓我們進一步了解 dataclass 的用法,以及它能為我們改變什么。

初始化

 

 

使用 dataclass

 

 

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

1. 不必定義__init__然后再賦值給 self, 裝飾器會注意這一點

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

Python 之道:可讀性很重要

也可以定義默認值:

 

 

對象表示是一種對象的字符串表示法,在調(diào)試時非常有用。

默認的 Python 對象表示不是非常的有用:

 

 

這種表示法不能給我們對象用途的提示,同時將導(dǎo)致可怕的調(diào)試經(jīng)歷。

一種有意義的表示法可以通過在類定義里,添加一種__repr__方法實現(xiàn)。

 

 

現(xiàn)在我們就有了一種有意義的對象表示法:

 

 

dataclass 會自動添加一個__repr__函數(shù),因此我們不必手動實現(xiàn)它了。

 

 

數(shù)據(jù)比較

通常,數(shù)據(jù)對象會伴隨著相互比較的需要。兩個對象'a'和'b'之間通常包含以下的運算:

a < b
a > b
a == b
a >= b
a <= b

在 Python 里,可以通過在類中定義一些方法來實現(xiàn)上述運算。為了保證整篇文章的簡潔性,我將只實現(xiàn) == 和 < 。

通常做法

 

 

使用 dataclass

 

 

就這樣。

我們不需要定義__eq__和__lt__方法,因為當(dāng)我們調(diào)用 order = True 時,dataclass 裝飾器會自動把他們添加到類定義里。

那么,它是如何做到的呢?

我們已經(jīng)知道,當(dāng)你使用 dataclass 時,它在類定義里添加了__eq__和__lt__函數(shù)。那么,這些函數(shù)具體是如何檢查不等性和做比較的呢?

由 dataclass 生成的__eq__函數(shù),會將其屬性元組和另一個同類實例的屬性元組進行比較。在我們的例子里,自動生成的__eq__函數(shù)等價于:

 

 

再看一個更復(fù)雜的例子:

我們將要寫一個叫 Person 的 dataclass,并存儲他們的 name 和 age。

 

 

自動生成的__eq__方法等價于:

 

 

注意這些屬性的順序。他們總是按照在類定義里的排序生成。

類似的,等價的__le__函數(shù)將是這樣:

 

 

通常,在你需要排序一列數(shù)據(jù)對象時,會有定義__le__函數(shù)的需要。Python 內(nèi)置的排序函數(shù)依賴于比較兩個對象:

 

 

原文鏈接:https://medium.com/mindorks/understanding-python-dataclasses-part-1-c3ccd4355c34

標簽:

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:在工程領(lǐng)域中,機器學(xué)習(xí)的數(shù)學(xué)理論基礎(chǔ)尤為重要

下一篇:基于Keras對深度學(xué)習(xí)模型進行微調(diào)的全面指南 Part 1