成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python 3.7 將引入 dataclass 裝飾器

leanote / 2707人閱讀

摘要:簡(jiǎn)評(píng)將于今年夏天發(fā)布,中將會(huì)有許多新東西,最激動(dòng)人心的新功能之一是裝飾器。因此,只需將代碼更改為以下代碼即可實(shí)現(xiàn)四種方法我們?nèi)サ袅朔椒?,以確保裝飾器可以添加它生成的對(duì)應(yīng)方法。

簡(jiǎn)評(píng):Python 3.7 將于今年夏天發(fā)布,Python 3.7 中將會(huì)有許多新東西,最激動(dòng)人心的新功能之一是 dataclass 裝飾器。
什么是 Data Class

大多數(shù) Python 開(kāi)發(fā)人員編寫(xiě)過(guò)很多像下面這樣的類:

dataclass 可以為簡(jiǎn)單的情況自動(dòng)生成方法,例如,一個(gè)init接受這些參數(shù)并將其分配給自己,之前的小例子可以重寫(xiě)為:

那么通過(guò)一個(gè)例子來(lái)看看如何使用吧

星球大戰(zhàn) API

可以使用 requests 從星球大戰(zhàn) API 獲取資源:

讓我們來(lái)看看 dictionary (簡(jiǎn)化過(guò))的結(jié)果:

封裝 API 為了正確地封裝一個(gè) API,我們應(yīng)該創(chuàng)建一個(gè)用戶可以在其應(yīng)用程序中使用的對(duì)象,因此,在Python 3.6 中定義一個(gè)對(duì)象來(lái)包含requests對(duì) /films/endpoint的響應(yīng):

class StarWarsMovie:
    
def __init__(self,
            title: str,
            episode_id: int,
            opening_crawl: str,
                        director: str,
            producer: str,
            release_date: datetime,
            characters: List[str],
            planets: List[str],
            starships: List[str],
            vehicles: List[str],
            species: List[str],
            created: datetime,
            edited: datetime,
            url: str            
            ):
    
self.title = title
self.episode_id = episode_id
self.opening_crawl= opening_crawl
self.director = director
self.producer = producer
self.release_date = release_date
self.characters = characters
self.planets = planets
self.starships = starships
self.vehicles = vehicles
self.species = species    
self.created = created    
self.edited = edited    
self.url = url
    
if type(self.release_date) is str:
       self.release_date = dateutil.parser.parse(self.release_date)
    
if type(self.created) is str:
       self.created = dateutil.parser.parse(self.created)
    
if type(self.edited) is str:
       self.edited = dateutil.parser.parse(self.edited)

仔細(xì)的讀者可能已經(jīng)注意到這里有一些重復(fù)的代碼。

這是使用 dataclass 裝飾器的經(jīng)典案例,我們需要?jiǎng)?chuàng)建一個(gè)主要用來(lái)保存數(shù)據(jù)的類,只需一點(diǎn)驗(yàn)證,所以讓我們來(lái)看看我們需要修改什么。

首先,data class 自動(dòng)生成一些 dunder 方法,如果我們沒(méi)有為 data class 裝飾器指定任何選項(xiàng),則生成的方法有:init,eq和repr,如果你已經(jīng)定義了repr但沒(méi)定義str,默認(rèn)情況下 Python(不僅僅是 data class)將實(shí)現(xiàn)返回repr的輸出str方法。因此,只需將代碼更改為以下代碼即可實(shí)現(xiàn)四種 dunder 方法:

我們?nèi)サ袅薸nit方法,以確保 data class 裝飾器可以添加它生成的對(duì)應(yīng)方法。不過(guò),我們?cè)谶@個(gè)過(guò)程中失去了一些功能,我們的 Python 3.6 構(gòu)造函數(shù)不僅定義了所有的值,還試圖解析日期,我們?cè)鯓硬拍苡?data class 來(lái)做到這一點(diǎn)呢?

如果要覆蓋 init,我們將失去 data class 的優(yōu)勢(shì),因此,如果要處理任何附加功能可以使用新的 dunder 方法:postinit,讓我們看看postinit方法對(duì)于我們的包裝類來(lái)說(shuō)是什么樣子的:

就是這樣! 我們可以使用 data class 裝飾器在用三分之二的代碼量實(shí)現(xiàn)我們的類。

更多好東西

通過(guò)使用裝飾器的選項(xiàng),可以為用例進(jìn)一步定制 data class,默認(rèn)選項(xiàng)是:

init決定是否生成init dunder 方法 repr決定是否生成repr dunder方法 eq對(duì)eq dunder 方法也是如此,它決定相等性檢查的行為(yourclassinstance == another_instance) order 實(shí)際上創(chuàng)建了四種 dunder 方法,它們確定所有檢查小于,and/or,大于的行為,如果將其設(shè)置為 true,則可以對(duì)對(duì)象列表進(jìn)行排序。 最后兩個(gè)選項(xiàng)確定對(duì)象是否可以被哈?;?,如果你想使用你的 class 的對(duì)象作為字典鍵的話,這是必要的。

更多信息請(qǐng)參考:PEP 557 -- Data Classes

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41654.html

相關(guān)文章

  • Python 面向?qū)ο缶幊蘋(píng)OP (五) 寫(xiě)類神Dataclass

    摘要:大家好,上一期受到了朋友的啟發(fā),這一期我主要記錄一下我的的學(xué)習(xí)過(guò)程。 Dataclasses 大家好,上一期受到了朋友的啟發(fā),這一期我主要記錄一下我的Dataclasses的學(xué)習(xí)過(guò)程。 之前簡(jiǎn)單回顧了attrs的用法,這一期來(lái)看更簡(jiǎn)潔的自帶寫(xiě)類神器:dataclasses,需要注意,版本要大于等于Python 3.7 官方文檔鏈接: Data Classes下面直接來(lái)看例子: 創(chuàng)建Da...

    elarity 評(píng)論0 收藏0
  • Python 2.7終結(jié)于7個(gè)月后,這是你需要了解的3.X炫酷新特性

    摘要:截止到月號(hào)上午點(diǎn),將終結(jié)于在這一段時(shí)間中,很多優(yōu)秀開(kāi)源項(xiàng)目與庫(kù)已經(jīng)停止了對(duì)的支持。除了,還提供了一種通過(guò)進(jìn)行字符串插入的靈活方法。擴(kuò)展的可迭代對(duì)象解包最低版本為對(duì)于這個(gè)特性,代碼就說(shuō)明了一切。從 3.0 到 3.8,Python 3 已經(jīng)更新了一波又一波,但似乎我們用起來(lái)和 2.7 沒(méi)有太大區(qū)別?以前該怎么寫(xiě) 2.7 的代碼現(xiàn)在就怎么寫(xiě),只不過(guò)少數(shù)表達(dá)方式變了而已。在這篇文章中,作者介紹了 ...

    番茄西紅柿 評(píng)論0 收藏0
  • Python 2.7終結(jié)于7個(gè)月后,這是你需要了解的3.X炫酷新特性

    摘要:截止到月號(hào)上午點(diǎn),將終結(jié)于在這一段時(shí)間中,很多優(yōu)秀開(kāi)源項(xiàng)目與庫(kù)已經(jīng)停止了對(duì)的支持。除了,還提供了一種通過(guò)進(jìn)行字符串插入的靈活方法。擴(kuò)展的可迭代對(duì)象解包最低版本為對(duì)于這個(gè)特性,代碼就說(shuō)明了一切。從 3.0 到 3.8,Python 3 已經(jīng)更新了一波又一波,但似乎我們用起來(lái)和 2.7 沒(méi)有太大區(qū)別?以前該怎么寫(xiě) 2.7 的代碼現(xiàn)在就怎么寫(xiě),只不過(guò)少數(shù)表達(dá)方式變了而已。在這篇文章中,作者介紹了 ...

    chadLi 評(píng)論0 收藏0
  • python基礎(chǔ)教程:異步IO 之 概念和歷史

    摘要:并發(fā)的方式有多種,多線程,多進(jìn)程,異步等。多線程和多進(jìn)程之間的場(chǎng)景切換和通訊代價(jià)很高,不適合密集型的場(chǎng)景關(guān)于多線程和多進(jìn)程的特點(diǎn)已經(jīng)超出本文討論的范疇,有興趣的同學(xué)可以自行搜索深入理解。 編程中,我們經(jīng)常會(huì)遇到并發(fā)這個(gè)概念,目的是讓軟件能充分利用硬件資源,提高性能。并發(fā)的方式有多種,多線程,多進(jìn)程,異步IO等。多線程和多進(jìn)程更多應(yīng)用于CPU密集型的場(chǎng)景,比如科學(xué)計(jì)算的時(shí)間都耗費(fèi)在CPU...

    BicycleWarrior 評(píng)論0 收藏0
  • python 多個(gè)裝飾的調(diào)用順序

    摘要:如果不使用裝飾器的話,普通的做法可能是在中寫(xiě)一堆校驗(yàn)代碼來(lái)判斷用戶是否登錄,然后決定后面的執(zhí)行邏輯,這樣比較麻煩。 前言 裝飾器是程序開(kāi)發(fā)中經(jīng)常會(huì)用到的一個(gè)功能,也是python語(yǔ)言開(kāi)發(fā)的基礎(chǔ)知識(shí),如果能夠在程序中合理的使用裝飾器,不僅可以提高開(kāi)發(fā)效率,而且可以讓寫(xiě)的代碼看上去顯的高大上^_^ 使用場(chǎng)景 可以用到裝飾器的地方有很多,簡(jiǎn)單的舉例如以下場(chǎng)景 引入日志 函數(shù)執(zhí)行時(shí)間統(tǒng)計(jì) 執(zhí)...

    wapeyang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<