當前位置:
首頁 > 最新 > Python 3.7:數據類的介紹

Python 3.7:數據類的介紹

Python3.7預計在今年夏天發布,讓我們一起偷瞄一眼它帶來的新功能吧!如果你經常一個人在家用Pycharm擼代碼,請確保將你的Pycharm升級到2018.1版本。(等你讀完本文再升級也來得及)。

Python3.7版本包含了眾多新特性:比如對各種字符集的升級,推後了對注釋的評價等等。其中最受期待的新特性是對數據類裝飾器的支持。

什麼是數據類

絕大多數的python開發者都寫過許多類,比如下圖這樣的。

數據類可以自動地給你定義的實例生成「魔術」方法。例如:__init__可以接收參數,並把參數分配給self。上圖中的小例子也可以這樣寫:

其中關鍵的不同點在於,數據類實際上是要求類型提示的。如果你以前從未用到過類型提示:類型提示允許你標記代碼中某一個變數應該是哪種數據類型的。在運行時,變數的數據類型不會被檢查,但你可以用Pycharm或者命令行工具比如mypy來靜態的檢查你的代碼。

那麼,讓我們看看如何使用這個新特性。

星球大戰API

你一定知道當一個電影粉絲用自己最愛的電影的數據創建了一個組REST API會讓這個電影的粉絲團熱情響應。一個星戰粉絲就是這麼乾的,創建了星球大戰API。實際上他做的更完善,直接為這個API創建了一個python庫。

讓我們暫時忘記這個包裝庫的存在,並探究一下如何創建我們自己的庫。

我們可以用request庫從星球大戰API中獲取資源。

這個終端(和所有終端一樣)用JSON格式的信息進行響應。Request庫還提供JSON解析。

此時我們把數據存入到了一個字典中,讓我們來看一下。

封裝這個API

為了正確封裝這個API,我們應該創建一個讓用戶可以在自己的應用使用的對象。所以讓我們用Python3.6定義一個對象來存放對/films/終端請求的響應。

細心的讀者可能已經注意到了上面的代碼有一些冗餘,不太細心的讀者可以參考一下完整的Python3.6實現(可不短呦)。

這是一個數據類裝飾器幫你擺脫困境的經典案例。我們創建了一個用來保存數據,只進行少量驗證的類。接下來一起看看有哪些地方需要修改。

首先,數據類自動的生成一些個魔術方法。如果我們沒有指定任何數據類裝飾器的選項,則自動生成的魔術方法為:__init__,__eq__,以及__repr__.如果你以及定義了__repr__,而不是__str__,那麼python會默認地實現__str__以返回__repr__的輸出結果。進而,你只要將代碼如下圖這樣修改一下就得到了四種魔術方法:

在這裡我們去掉了__init__方法來確保數據類裝飾器可以添加它的子集。不幸的是在這一步中,我們還缺少了一個功能。我們的Python3.6構造函數不僅定義了所有的值,同時它還應該會嘗試去解析數據。我們應該如何用數據類來實現這個功能呢?

如果我們重寫__init__方法,那麼就失去了用數據類的好處。因此,為了實現這些額外的處理,一個新的魔術方法__post_init__就誕生了。一起看下這個方法在我們要封裝的對象中長什麼樣子:

大功告成,在數據類裝飾器的幫助下,我們僅用了原先1/3行數的代碼就實現了我們的類。

更多的好處

通過使用裝飾器的選項,你可以進一步為自己的實例定製數據類。默認的選項是這樣的:

init選項決定是否生成__init__方法。

repr選項決定是否生成__repr__方法。

eq選項同上,其中__eq__方法定義了檢查是否相等的操作。

order選項實際上生成了四個用來定義檢查大於、小於、and、or操作的魔術方法,設置此項為True,你就可以對對象進行排序。

最後的兩個選項決定了你的對象是否能被哈希。這是非常必要的,比如在你想用類的對象作為字典鍵時。哈希函數應該在對象的生命周期內一直生效,否則存儲數據的字典就再也找不到你的對象了。數據類中的__hash__函數將會默認地返回數據類中所有對象的哈希值。因此,只有在你設置對象為只讀時(令frozen=True)才會默認地生成__hash__函數。

一旦使用frozen=True設置了只讀屬性,任何對你的對象進行寫入的操作都會報錯。如果你覺得這樣太苛刻,並且還是想要確保對象永遠不會被改變,那麼可以設置unsafe_hash=True來代替frozen=True。數據類裝飾器的開發者們不建議這樣做。

如果你想更加深入的了解數據類,可以查閱PEP或者直接開始使用數據類玩耍啦。請在評論中告訴我們你都用數據類做了什麼!

英文原文:https://blog.jetbrains.com/pycharm/2018/04/python-37-introducing-data-class/

譯者:舞象加冠


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

Python入門學習指南
Python到底是個啥?

TAG:Python |