Python進階:Python魔法方法


小密圈內有好幾個同學問我:學習完了Python基礎之后,學些什么呢?


看到這個問題之后,我沒在考慮學習基礎之后學什么,而我在想真的學完了嗎?想以前我也是對着w3c對着廖雪峰的網上教程學習了一遍Python,就開始寫爬蟲了,后來又讀了《Python編程》《Python網絡數據采集》等好幾本書,感覺自己最少是把Python基礎學完了。


不過當我看一些開源項目,看到很多的代碼我都看不懂,我才慢慢明白,其實我只是處於Python入門階段,我想大部分人與當時的我一樣很迷茫。


從入門到進階,一個很重要的點就是Python中的魔法方法,今天我就把自己壓箱底貨:之前學習Python魔法方法時候留下的筆記加工潤色一遍送給大家,希望能對大家有用。


魔法方法就是可以給你的類增加魔力的特殊方法,如果你的對象實現了這些方法中的某一個,那么這個方法就會在特殊的情況下被 Python 所調用,你可以定義自己想要的行為,而這一切都是自動發生的。它們經常是兩個下划線包圍來命名的(比如 __init__/__new__等等),Python的魔法方法是非常強大的。


如果你學習過Java,那你會發現Python中的魔法方法像是Java中的重載,Python中的魔法方法可以理解為:對類中的內置方法的重載,注意這里不是重寫。


舉個例子,Python中有個比較操作符==用來比較兩個變量的大小,而這個操作符是通過內置函數__eq__來實現的,所以我們只需要通過改變這個內置函數代碼,就可以改變重新定義這個操作符的行為。


我們定義一個類Word,繼承自str類,現需要重新定義該類的操作符==,使這個操作符用來判斷兩個字符串長度是否相等,而不是通過字母順序判斷兩個字符串是否相等。注意該變化只適用於Word類,而不適用於其它類。


640?



再舉個例子:Python中的__new__方法是對象實例化時調用的第一個方法,該方法僅讀取一個cls參數后再把其他參數都傳給用於指明對象初始化行為的__init__方法,也就是說我們可以在一個對象初始化之前進行其他操作,比如檢查是否合法等;而另一個方法__del__可以用來銷毀對象,定義了對象被垃圾回收的行為,我們可以利用該方法進行資源回收等操作。


我們可以通過重寫__new__方法實現一個單例模式,在每次實例化之前檢查該對象是否有已有實例。


640?


通過這兩個例子相信你已經對Python的魔法方法比較理解了,但是Python中的魔法方法遠不止兩三個,而在官方文檔中,也沒有一個比較詳細的歸納,所以這里參考譯文(點擊閱讀原文可以直達)做一個簡單的匯總,希望大家可以根據這個匯總的表單對其中的魔法方法進行嘗試,下次再看到這樣的用法也就不足為奇了。


由於版本等問題,以下的表格對譯文的內容進行了修改、刪減。


640?


以上是關於操作符運算符的方法,我們很少會改變這些魔法方法除非你真的需要改變他們,當然還有一些我們可能會用到的:


1、__str__/__repr__

__str__定義對類的實例調用str()時的行為。而__repr__定義對類的實例調用repr()的行為,這兩者的區別就是repr面向機器,str面向人。定義類的輸出的時候經常會使用這兩個其中的魔法。


640?


 2、__getattr__/__setattr__/__del__attr

使用這三個方法你可以隨時修改、刪除、添加類屬性或值,是不是覺得大吃一驚?


640?


Python中魔法函數常用的大體如上,也還有一些沒有提到,你可以點擊閱讀原文進行學習。另外周五了,祝大家周末愉快。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com