資源描述:
《python 魔術(shù)方法指南》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Python魔術(shù)方法指南入門構(gòu)造和初始化構(gòu)造定制類§用于比較的魔術(shù)方法§用于數(shù)值處理的魔術(shù)方法表現(xiàn)你的類控制屬性訪問創(chuàng)建定制序列反射可以調(diào)用的對象會話管理器創(chuàng)建描述器對象持久化對象總結(jié)附錄介紹此教程為我的數(shù)篇文章中的一個重點。主題是魔術(shù)方法。什么是魔術(shù)方法?他們是面向?qū)ο蟮腜ython的一切。他們是可以給你的類增加”magic”的特殊方法。他們總是被雙下劃線所包圍(e.g.__init__或者__lt__)。然而他們的文檔卻遠沒有提供應(yīng)該有的內(nèi)容。Python中所有的魔術(shù)方法均在Python官方文檔中有相應(yīng)描述,但是對于他們的描述比較混亂而且組織比較松散。很難找到有一個例子(也許他們原
2、本打算的很好,在開始語言參考中有描述很詳細,然而隨之而來的確是枯燥的語法描述等等)。所以,為了修補我認為Python文檔應(yīng)該修補的瑕疵,我決定給Python中的魔術(shù)方法提供一些用平淡的語言和實例驅(qū)使的文檔。我在開始已經(jīng)寫了數(shù)篇博文,現(xiàn)在在這篇文章中對他們進行總結(jié)。我希望你能夠喜歡這篇文章。你可以將之當做一個教程,一個補習(xí)資料,或者一個參考。本文章的目的僅僅是為Python中的魔術(shù)方法提供一個友好的教程。構(gòu)造和初始化每個人都知道一個最基本的魔術(shù)方法,__init__。通過此方法我們可以定義一個對象的初始操作。然而,當我調(diào)用x=SomeClass()的時候,__init__并不是第一個被調(diào)
3、用的方法。實際上,還有一個叫做__new__的方法,來構(gòu)造這個實例。然后給在開始創(chuàng)建時候的初始化函數(shù)來傳遞參數(shù)。在對象生命周期的另一端,也有一個__del__方法。我們現(xiàn)在來近距離的看一看這三個方法:__new__(cls,[...)__new__是在一個對象實例化的時候所調(diào)用的第一個方法。它的第一個參數(shù)是這個類,其他的參數(shù)是用來直接傳遞給__init__方法。__new__方法相當不常用,但是它有自己的特性,特別是當繼承一個不可變的類型比如一個tuple或者string。我不希望在__new__上有太多細節(jié),因為并不是很有用處,但是在Python文檔中有詳細的闡述。__init__(
4、self,[…)此方法為類的初始化方法。當構(gòu)造函數(shù)被調(diào)用的時候的任何參數(shù)都將會傳給它。(比如如果我們調(diào)用x=SomeClass(10,'foo')),那么__init__將會得到兩個參數(shù)10和foo。__init__在Python的類定義中被廣泛用到。__del__(self)如果__new__和__init__是對象的構(gòu)造器的話,那么__del__就是析構(gòu)器。它不實現(xiàn)語句delx(所以代碼將不會翻譯為x.__del__())。它定義的是當一個對象進行垃圾回收時候的行為。當一個對象在刪除的時候需要更多的清潔工作的時候此方法會很有用,比如套接字對象或者是文件對象。注意,因為當解釋器退出的
5、時候如果對象還存在,不能保證__del__能夠被執(zhí)行,所以__del__can’tserveasareplacementforgoodcodingpractices()~~~~~~~放在一起的話,這里是一個__init__和__del__實際使用的例子。fromos.pathimportjoinclassFileObject:'''給文件對象進行包裝從而確認在刪除時文件流關(guān)閉'''def__init__(self,filepath='~',filename='sample.txt'):#讀寫模式打開一個文件self.file=open(join(filepath,filename),'
6、r+')def__del__(self):self.file.close()delself.file讓定制的類工作起來使用Python的魔術(shù)方法的最大優(yōu)勢在于他們提供了一種簡單的方法來讓對象可以表現(xiàn)的像內(nèi)置類型一樣。那意味著你可以避免丑陋的,違反直覺的,不標準的的操作方法。在一些語言中,有一些操作很常用比如:ifinstance.equals(other_instance):#dosomething在Python中你可以這樣。但是這會讓人迷惑且產(chǎn)生不必要的冗余。相同的操作因為不同的庫會使用不同的名字,這樣會產(chǎn)生不必要的工作。然而有了魔術(shù)方法的力量,我們可以定義一個方法(本例中為__eq
7、__),就說明了我們的意思:ifinstance==other_instance:#dosomething這只是魔術(shù)方法的功能的一小部分。它讓你可以定義符號的含義所以我們可以在我們的類中使用。就像內(nèi)置類型一樣。用于比較的魔術(shù)方法Python對實現(xiàn)對象的比較,使用魔術(shù)方法進行了大的逆轉(zhuǎn),使他們非常只管而不是笨拙的方法調(diào)用。而且還提供了一種方法可以重寫Python對對象比較的默認行為(通過引用)。以下是這些方法和他們的作用。__cmp__(self