摘要:在對象接口后包裝其實現(xiàn)的細(xì)節(jié),從而隔離了代碼的修改對用戶產(chǎn)生的影響。類提供了一個新的本地作用域,最小化了變量名沖突。類其實并沒有結(jié)束,不過本講座到此對類暫告一段。
前面對類的有關(guān)內(nèi)容已經(jīng)描述不少了,其實話題遠(yuǎn)遠(yuǎn)沒有結(jié)束,不過對于初學(xué)者,掌握這些已經(jīng)算是入門,在以后的實踐中,還需要進行體會和感悟。
這幾天和幾個朋友以各種途徑討論過OOP的相關(guān)問題,他們是:令狐蟲、Frank、晉劍、小馮
大家對OOP有不同看法,所謂工程派和學(xué)院派看法不一致。從應(yīng)用的角度看,工程派的觀點是值得推薦的,那就是:不用太在意內(nèi)部是怎么工作的,只要能夠解決眼下的問題即可。但是,對于學(xué)習(xí)者而言,如果僅僅停留在工程派的層面(特別提醒,上述幾位朋友都是工程派的大俠,他們可不是簡單地能夠使用,其實是更高層次的“無招勝有招”),學(xué)習(xí)者可能感覺有點不透徹。所以,學(xué)習(xí)者,特別是初學(xué)者,要知道一些內(nèi)部原因,但是也別為了鉆研內(nèi)部原因而忘記了應(yīng)用的目的。看來兩者協(xié)調(diào)還是一個難辦的事情。不用著急,隨著實踐的深入,就逐漸有體會了。
下面我根據(jù)MARK Lutz的《Learning Python》中的“大師眼中的OOP”,列一些使用OOP的常見原因。
代碼重用。這是很簡單(并且是使用OOP的最主要原因)。通過支持繼承,類允許通過定制來編程,而不是每次都從頭開始一個項目。
封裝。在對象接口后包裝其實現(xiàn)的細(xì)節(jié),從而隔離了代碼的修改對用戶產(chǎn)生的影響。
結(jié)構(gòu)。類提供了一個新的本地作用域,最小化了變量名沖突。他們還提供了一種編寫和查找實現(xiàn)代碼,以及去管理對象狀態(tài)的自然場所。
維護性。類自然而然地促進了代碼的分解,這讓我們減少了冗余。對虧支持類的結(jié)構(gòu)以及代碼重用,這樣每次只需要修改代碼中一個拷貝就可以了。
一致性。類和繼承可以實現(xiàn)通用的接口。這樣代碼不僅有了統(tǒng)一的外表和觀感,還簡化了代碼的調(diào)試、理解以及維護。
多態(tài)。多態(tài)讓代碼更靈活和有了廣泛的適用性。(這似乎是OOP的屬性,不是使用它的理由)
不管怎么樣,類是一個非常重要的東西,看官在學(xué)習(xí)的時候,一定要多加運用。
此外,對于python2來說,還有一個叫做“新式類”(new-style)的東西,這個對應(yīng)于前面講過的類,那么前面講過的類就稱為“經(jīng)典”(classic)類。但是,對于Python3來講,沒有這種區(qū)別,二者融合。只是在Python2中,兩個是有區(qū)別的。本教程在基礎(chǔ)部分,依然不講授新式類的問題,如果看官有興趣,可以自己在GOOGLE中查找有關(guān)資料,也可以隨著本課程深入,到下一個階段來學(xué)習(xí)。
綁定和無綁定方法看官是否還記得,在學(xué)習(xí)類的方法的時候,提到過,類的方法就是函數(shù),只不過這個函數(shù)的表現(xiàn)有點跟前面學(xué)過的函數(shù)不一樣,比如有個self。當(dāng)然,也不是必須要有的,下面看官就會看到?jīng)]有self的。既然方法和函數(shù)一樣,本質(zhì)上都是函數(shù),那么,函數(shù)那部分學(xué)習(xí)的時候已經(jīng)明確了:函數(shù)是對象,所以,類方法也是對象。正如剛才說的,類的方法中,有的可以有self,有的可以沒有。為了進行區(qū)別,進一步做了這樣的定義:
無綁定類方法對象:無self
綁定實例方法對象:有self
調(diào)用綁定實例方法對象>>> class MyClass: ... def foo(self,text): ... print text ...
可以用下面的方式調(diào)用實例方法
>>> a = MyClass() #創(chuàng)建類實例 >>> a.foo("qiwsir.github.io") #調(diào)用實例方法 qiwsir.github.io >>> a.foo>
在這個實例方法調(diào)用的時候,其數(shù)據(jù)傳遞流程,在《編寫類之二方法》中有一張圖,圖中顯示了,上述的調(diào)用方法中,其實已經(jīng)將實例名稱a傳給了self,這就是調(diào)用綁定實例方法對象,有self。
上面的調(diào)用過程,還可以這樣來實現(xiàn):
>>> a = MyClass() >>> x = a.foo #把實例a和方法函數(shù)foo綁定在一起 >>> x> >>> x("qiwsir.github.io") qiwsir.github.io
在上面的調(diào)用中,其實相當(dāng)于前面的調(diào)用過程的分解動作。即先將實例a和方法函數(shù)foo綁定在一起,然后賦值給x,這時候x就相當(dāng)于一個簡單函數(shù)一樣,可以通過上述方式傳入?yún)?shù)。這里將實例和方法函數(shù)綁定的方式就是運用點號運算(object.method_function)
調(diào)用無綁定類方法對象所謂類方法對象,就是不通過實例,而是用類進行點號運算來獲得方法函數(shù)(ClassName.method_function)
>>> a = MyClass() >>> y = MyClass.foo #這里沒有用類調(diào)用 >>> y
這樣的調(diào)用,就得到了無綁定方法對象,但是,調(diào)用的時候必須傳入實例做為第一參數(shù),如下
>>> y(a,"qiwsir.github.io") qiwsir.github.io
否則,就報錯。請看官特別注意報錯信息
>>> y("qiwsir.github.io") Traceback (most recent call last): File "", line 1, in TypeError: unbound method foo() must be called with MyClass instance as first argument (got str instance instead) >>>
在編程實踐中,似乎用實例方法調(diào)用更多一下。
文檔字符串在寫程序的時候,必須要寫必要的文字說明,沒別的原因,除非你的代碼寫的非常容易理解,特別是各種變量、函數(shù)和類等的命名任何人都能夠很容易理解,否則,文字說明是不可缺少的。
在函數(shù)、類或者文件開頭的部分寫文檔字符串說明,一般采用三重引號。這樣寫的最大好處是能夠用help()函數(shù)看。
"""This is python lesson""" def start_func(arg): """This is a function.""" pass class MyClass: """Thi is my class.""" def my_method(self,arg): """This is my method.""" pass
這樣的文檔是必須的。
當(dāng)然,在編程中,有不少地方要用“#”符號來做注釋。一般用這個來注釋局部。
類其實并沒有結(jié)束,不過本講座到此對類暫告一段。看官要多實踐。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/37414.html
摘要:的非阻塞單線程的特點在這個模塊中體現(xiàn)。還有一個模塊引入,是用完成的這兩句就顯示了所謂命令行解析模塊的用途了。表示可以接收來自的請求了。以上把一個簡單的剖析。 As he walked by the sea of Galilee, he saw two brothers, Simon, who is called Peter, and Andrew his brother, cas...
摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),。本文來源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲軟件定制開發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲學(xué)習(xí)系列教程(來源于某博主:htt...
摘要:私有函數(shù)在某些時候,會看到有一種方法命名比較特別,是以雙劃線開頭的,將這類命名的函數(shù)方法稱之為私有函數(shù)。如果一個函數(shù)類方法或?qū)傩缘拿忠詢蓚€下劃線開始但不是結(jié)束它是私有的其它所有的都是公有的。比如前面反復(fù)提到的就是一個典型的專有方法。 在任何語言中,都會規(guī)定某些對象(屬性、方法、函數(shù)、類等)只能夠在某個范圍內(nèi)訪問,出了這個范圍就不能訪問了。這是公、私之分。此外,還會專門為某些特殊的東西...
摘要:反對者在某些領(lǐng)域?qū)Υ擞枰苑裾J(rèn)。下面再引用一段來自維基百科中關(guān)于的歷史。類的更嚴(yán)格的定義是由某種特定的元數(shù)據(jù)所組成的內(nèi)聚的包。類還可以有運行時表示形式元對象,它為操作與類相關(guān)的元數(shù)據(jù)提供了運行時支持。 在開始部分,請看官非常非常耐心地閱讀下面幾個枯燥的術(shù)語解釋,本來這不符合本教程的風(fēng)格,但是,請看官諒解,因為列位將來一定要閱讀枯燥的東西的。這些枯燥的屬于解釋,均來自維基百科。 1、問題...
摘要:從運行結(jié)果可以看出,當(dāng)子類繼承多個父類的時候,對于構(gòu)造函數(shù),只有第一個能夠被繼承,第二個就等掉了。重點看,類繼承了,同時,在構(gòu)造函數(shù)中自己做了規(guī)定,也就是的構(gòu)造函數(shù)是按照的意愿執(zhí)行,不執(zhí)行的內(nèi)容,但是,還有一個方法,則繼承了這個方法。 在上一講代碼的基礎(chǔ)上,做進一步修改,成為了如下程序,請看官研習(xí)這個程序: #!/usr/bin/env python #coding:utf-8 c...
閱讀 3478·2021-11-08 13:30
閱讀 3584·2019-08-30 15:55
閱讀 688·2019-08-29 15:16
閱讀 1750·2019-08-26 13:57
閱讀 2091·2019-08-26 12:18
閱讀 789·2019-08-26 11:36
閱讀 1733·2019-08-26 11:30
閱讀 3017·2019-08-23 16:46