国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python 3.7 將引入 dataclass 裝飾器

leanote / 2702人閱讀

摘要:簡評將于今年夏天發布,中將會有許多新東西,最激動人心的新功能之一是裝飾器。因此,只需將代碼更改為以下代碼即可實現四種方法我們去掉了方法,以確保裝飾器可以添加它生成的對應方法。

簡評: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

相關文章

  • Python 面向對象編程OOP (五) 寫類神Dataclass

    摘要:大家好,上一期受到了朋友的啟發,這一期我主要記錄一下我的的學習過程。 Dataclasses 大家好,上一期受到了朋友的啟發,這一期我主要記錄一下我的Dataclasses的學習過程。 之前簡單回顧了attrs的用法,這一期來看更簡潔的自帶寫類神器:dataclasses,需要注意,版本要大于等于Python 3.7 官方文檔鏈接: Data Classes下面直接來看例子: 創建Da...

    elarity 評論0 收藏0
  • Python 2.7終結于7個月后,這是你需要了解的3.X炫酷新特性

    摘要:截止到月號上午點,將終結于在這一段時間中,很多優秀開源項目與庫已經停止了對的支持。除了,還提供了一種通過進行字符串插入的靈活方法。擴展的可迭代對象解包最低版本為對于這個特性,代碼就說明了一切。從 3.0 到 3.8,Python 3 已經更新了一波又一波,但似乎我們用起來和 2.7 沒有太大區別?以前該怎么寫 2.7 的代碼現在就怎么寫,只不過少數表達方式變了而已。在這篇文章中,作者介紹了 ...

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

    摘要:截止到月號上午點,將終結于在這一段時間中,很多優秀開源項目與庫已經停止了對的支持。除了,還提供了一種通過進行字符串插入的靈活方法。擴展的可迭代對象解包最低版本為對于這個特性,代碼就說明了一切。從 3.0 到 3.8,Python 3 已經更新了一波又一波,但似乎我們用起來和 2.7 沒有太大區別?以前該怎么寫 2.7 的代碼現在就怎么寫,只不過少數表達方式變了而已。在這篇文章中,作者介紹了 ...

    chadLi 評論0 收藏0
  • python基礎教程:異步IO 之 概念和歷史

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

    BicycleWarrior 評論0 收藏0
  • python 多個裝飾的調用順序

    摘要:如果不使用裝飾器的話,普通的做法可能是在中寫一堆校驗代碼來判斷用戶是否登錄,然后決定后面的執行邏輯,這樣比較麻煩。 前言 裝飾器是程序開發中經常會用到的一個功能,也是python語言開發的基礎知識,如果能夠在程序中合理的使用裝飾器,不僅可以提高開發效率,而且可以讓寫的代碼看上去顯的高大上^_^ 使用場景 可以用到裝飾器的地方有很多,簡單的舉例如以下場景 引入日志 函數執行時間統計 執...

    wapeyang 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<