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