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

理解Python數(shù)據(jù)類:Dataclass fields 的概述(下)

2018-08-16    來源:raincent

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬Linux鏡像隨意使用
原標(biāo)題 Understanding Python Dataclasses?—?Part 2 ,作者為 Shikhar Chauhan 。

 

 

這是 Python 最新的 Dataclasses 系列的第二部分內(nèi)容。在第一部分里,我介紹了 dataclasses 的一般用法。這篇主要介紹另一個(gè)特征:dataclasses.field。

 

 

我們已經(jīng)知道 Dataclasses 會(huì)生成他們自身的__init__方法。它同時(shí)把初始化的值賦給這些字段。以下是我們?cè)谏弦黄┛屠锒x的內(nèi)容:

• 變量名

• 數(shù)據(jù)類型

這些內(nèi)容僅給我們有限的 dataclass 字段使用范圍。讓我們討論一下這些局限性,以及它們?nèi)绾瓮ㄟ^ dataclass.field 被解決。

復(fù)合初始化

考慮以下情形:你想要初始化一個(gè)變量為列表。你如何實(shí)現(xiàn)它呢?一種簡(jiǎn)單的方式是使用__post_init__方法。

 

 

數(shù)據(jù)類 Student 產(chǎn)生了一個(gè)名為 marks 的列表。我們不傳遞 marks 的值,而是使用__post_init__方法初始化。這是我們定義的單一屬性。此外,我們必須在__post_init__里調(diào)用 get_random_marks 函數(shù)。這些工作是額外的。

辛運(yùn)的是,Python 為我們提供了一個(gè)解決方案。我們可以使用 dataclasses.field 來定制化 dataclass 字段的行為以及它們?cè)?dataclass 的影響。

仍然是上述的使用情形,讓我們從__post_init__里去除 get_random_marks 的調(diào)用。以下是使用 dataclasses.field 的情形:

 

 

dataclasses.field 接受了一個(gè)名為 default_factory 的參數(shù),它的作用是:如果在創(chuàng)建對(duì)象時(shí)沒有賦值,則使用該方法初始化該字段。

default_factory 必須是一個(gè)可以調(diào)用的無參數(shù)方法(通常為一個(gè)函數(shù))。

這樣我們就可以使用復(fù)合形式初始化字段,F(xiàn)在,讓我們考慮另一個(gè)使用場(chǎng)景。

使用全部字段進(jìn)行數(shù)據(jù)比較

通過上篇博文,我們了解到,dataclass 能夠自動(dòng)生成< , =, >, <=和>=這些比較方法。但是這些比較方法的一個(gè)缺陷是,它們使用類中的所有字段進(jìn)行比較,而這種情況往往不常見。更經(jīng)常地,這種比較方法會(huì)給我們使用 dataclasses 造成麻煩。

考慮以下的使用情形:你有一個(gè)數(shù)據(jù)類用于存放用戶的信息,F(xiàn)在,它可能存在以下字段:

• 姓名
• 年齡
• 身高
• 體重

你僅想比較用戶對(duì)象的年齡、身高和體重。你不想比較姓名。這是后端開發(fā)者經(jīng)常會(huì)遇到的使用情景。

 

 

自動(dòng)生成的比較方法會(huì)比較一下的數(shù)組:

 

 

這將會(huì)破壞我們的意圖。我們不想讓姓名(name)用于比較。那么,如何使用 dataclasses.field 來實(shí)現(xiàn)我們的想法呢?

下面是具體步驟:

 

 

默認(rèn)情況下,所用的字段都用于比較,因此我們僅僅需要指定哪些字段用于比較,而實(shí)現(xiàn)方法是直接把不需要的字段定義為 filed(compare=False)。

一個(gè)更為簡(jiǎn)單的應(yīng)用情形也可以被討論。讓我們定義一個(gè)數(shù)據(jù)類,它被用來存儲(chǔ)一個(gè)數(shù)字激起字符串表示。我們想讓比較僅僅發(fā)生在該數(shù)字的值,而不是他的字符串表示。

 

 

現(xiàn)在,我們有更大的自由來控制 dataclasses 的行為?雌饋砗馨!

 

 

使用全部字段進(jìn)行數(shù)據(jù)表示

自動(dòng)生成的__repr__方法使用所有的字段用于表示。當(dāng)然,這也不是大多數(shù)情形下的理想選擇,尤其是當(dāng)你的數(shù)據(jù)類有大量的字段時(shí)。單個(gè)對(duì)象的表示會(huì)變得異常臃腫,對(duì)調(diào)試來說也不利。

 

 

想象一下在你的日志里看到這樣的表示吧,然后還要寫一個(gè)正則表達(dá)式來搜索它。太可怕了,對(duì)吧?

 

 

當(dāng)然,我們也能夠個(gè)性化這種行為?紤]一個(gè)類似的使用場(chǎng)景,也許最合適的用于表示的屬性是姓名(name)。那么對(duì)__repr__,我們僅使用它:

 

 

這樣看起來就很棒了。調(diào)試很方便,比較也有意義!

從初始化中省略字段

目前為止我們看到的所有例子,都有一個(gè)共同特點(diǎn)——即我們需要為所有被聲明的字段傳遞值,除了有默認(rèn)值之外。在那種情形下(指有默認(rèn)值的情況下),我們可以選擇傳遞值,也可以不傳遞。

 

 

但是,還有一種情形:我們可能不想在初始化時(shí)設(shè)定某個(gè)字段的值。這也是一種常見的使用場(chǎng)景。也許你在追蹤一個(gè)對(duì)象的狀態(tài),并且希望它在初始化時(shí)一直被設(shè)為 False。更一般地,這個(gè)值在初始化時(shí)不能夠被傳遞。

 

 

那么,我們?nèi)绾螌?shí)現(xiàn)上述想法呢?以下是具體內(nèi)容:

 

 

瞧啊!我們現(xiàn)在對(duì) dataclasses 的使用有了更大的靈活性。

總結(jié)

希望上兩篇博文能夠幫助你理解 dataclass,希望你能盡快在項(xiàng)目中使用它們!

原文鏈接:https://medium.com/mindorks/understanding-python-dataclasses-part-2-660ecc11c9b8

標(biāo)簽: 開發(fā)者 搜索

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

上一篇:TensorFlow2.0來了 動(dòng)態(tài)圖處理大幅升級(jí),支持更多語言和平臺(tái)

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