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