摘要:簡評將于今年夏天發布,中將會有許多新東西,最激動人心的新功能之一是裝飾器。因此,只需將代碼更改為以下代碼即可實現四種方法我們去掉了方法,以確保裝飾器可以添加它生成的對應方法。
簡評:Python 3.7 將于今年夏天發布,Python 3.7 中將會有許多新東西,最激動人心的新功能之一是 dataclass 裝飾器。什么是 Data Class
大多數 Python 開發人員編寫過很多像下面這樣的類:
dataclass 可以為簡單的情況自動生成方法,例如,一個init接受這些參數并將其分配給自己,之前的小例子可以重寫為:
那么通過一個例子來看看如何使用吧
星球大戰 API可以使用 requests 從星球大戰 API 獲取資源:
讓我們來看看 dictionary (簡化過)的結果:
封裝 API 為了正確地封裝一個 API,我們應該創建一個用戶可以在其應用程序中使用的對象,因此,在Python 3.6 中定義一個對象來包含requests對 /films/endpoint的響應:
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)
仔細的讀者可能已經注意到這里有一些重復的代碼。
這是使用 dataclass 裝飾器的經典案例,我們需要創建一個主要用來保存數據的類,只需一點驗證,所以讓我們來看看我們需要修改什么。
首先,data class 自動生成一些 dunder 方法,如果我們沒有為 data class 裝飾器指定任何選項,則生成的方法有:init,eq和repr,如果你已經定義了repr但沒定義str,默認情況下 Python(不僅僅是 data class)將實現返回repr的輸出str方法。因此,只需將代碼更改為以下代碼即可實現四種 dunder 方法:
我們去掉了init方法,以確保 data class 裝飾器可以添加它生成的對應方法。不過,我們在這個過程中失去了一些功能,我們的 Python 3.6 構造函數不僅定義了所有的值,還試圖解析日期,我們怎樣才能用 data class 來做到這一點呢?
如果要覆蓋 init,我們將失去 data class 的優勢,因此,如果要處理任何附加功能可以使用新的 dunder 方法:postinit,讓我們看看postinit方法對于我們的包裝類來說是什么樣子的:
就是這樣! 我們可以使用 data class 裝飾器在用三分之二的代碼量實現我們的類。
更多好東西通過使用裝飾器的選項,可以為用例進一步定制 data class,默認選項是:
init決定是否生成init dunder 方法 repr決定是否生成repr dunder方法 eq對eq dunder 方法也是如此,它決定相等性檢查的行為(yourclassinstance == another_instance) order 實際上創建了四種 dunder 方法,它們確定所有檢查小于,and/or,大于的行為,如果將其設置為 true,則可以對對象列表進行排序。 最后兩個選項確定對象是否可以被哈希化,如果你想使用你的 class 的對象作為字典鍵的話,這是必要的。
更多信息請參考:PEP 557 -- Data Classes
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41654.html
摘要:大家好,上一期受到了朋友的啟發,這一期我主要記錄一下我的的學習過程。 Dataclasses 大家好,上一期受到了朋友的啟發,這一期我主要記錄一下我的Dataclasses的學習過程。 之前簡單回顧了attrs的用法,這一期來看更簡潔的自帶寫類神器:dataclasses,需要注意,版本要大于等于Python 3.7 官方文檔鏈接: Data Classes下面直接來看例子: 創建Da...
摘要:截止到月號上午點,將終結于在這一段時間中,很多優秀開源項目與庫已經停止了對的支持。除了,還提供了一種通過進行字符串插入的靈活方法。擴展的可迭代對象解包最低版本為對于這個特性,代碼就說明了一切。從 3.0 到 3.8,Python 3 已經更新了一波又一波,但似乎我們用起來和 2.7 沒有太大區別?以前該怎么寫 2.7 的代碼現在就怎么寫,只不過少數表達方式變了而已。在這篇文章中,作者介紹了 ...
摘要:截止到月號上午點,將終結于在這一段時間中,很多優秀開源項目與庫已經停止了對的支持。除了,還提供了一種通過進行字符串插入的靈活方法。擴展的可迭代對象解包最低版本為對于這個特性,代碼就說明了一切。從 3.0 到 3.8,Python 3 已經更新了一波又一波,但似乎我們用起來和 2.7 沒有太大區別?以前該怎么寫 2.7 的代碼現在就怎么寫,只不過少數表達方式變了而已。在這篇文章中,作者介紹了 ...
摘要:并發的方式有多種,多線程,多進程,異步等。多線程和多進程之間的場景切換和通訊代價很高,不適合密集型的場景關于多線程和多進程的特點已經超出本文討論的范疇,有興趣的同學可以自行搜索深入理解。 編程中,我們經常會遇到并發這個概念,目的是讓軟件能充分利用硬件資源,提高性能。并發的方式有多種,多線程,多進程,異步IO等。多線程和多進程更多應用于CPU密集型的場景,比如科學計算的時間都耗費在CPU...
摘要:如果不使用裝飾器的話,普通的做法可能是在中寫一堆校驗代碼來判斷用戶是否登錄,然后決定后面的執行邏輯,這樣比較麻煩。 前言 裝飾器是程序開發中經常會用到的一個功能,也是python語言開發的基礎知識,如果能夠在程序中合理的使用裝飾器,不僅可以提高開發效率,而且可以讓寫的代碼看上去顯的高大上^_^ 使用場景 可以用到裝飾器的地方有很多,簡單的舉例如以下場景 引入日志 函數執行時間統計 執...
閱讀 1315·2021-11-22 14:44
閱讀 2456·2021-09-30 09:47
閱讀 1224·2021-09-09 11:56
閱讀 2088·2021-09-08 09:45
閱讀 3983·2021-08-31 09:40
閱讀 1260·2019-08-30 15:52
閱讀 2050·2019-08-30 14:09
閱讀 1591·2019-08-26 17:04