跟老齊學(xué)Python之類的細(xì)節(jié)
這幾天和幾個(gè)朋友以各種途徑討論過OOP的相關(guān)問題,他們是:令狐蟲、Frank、晉劍、小馮
大家對(duì)OOP有不同看法,所謂工程派和學(xué)院派看法不一致。從應(yīng)用的角度看,工程派的觀點(diǎn)是值得推薦的,那就是:不用太在意內(nèi)部是怎么工作的,只要能夠解決眼下的問題即可。但是,對(duì)于學(xué)習(xí)者而言,如果僅僅停留在工程派的層面(特別提醒,上述幾位朋友都是工程派的大俠,他們可不是簡(jiǎn)單地能夠使用,其實(shí)是更高層次的“無招勝有招”),學(xué)習(xí)者可能感覺有點(diǎn)不透徹。所以,學(xué)習(xí)者,特別是初學(xué)者,要知道一些內(nèi)部原因,但是也別為了鉆研內(nèi)部原因而忘記了應(yīng)用的目的??磥韮烧邊f(xié)調(diào)還是一個(gè)難辦的事情。不用著急,隨著實(shí)踐的深入,就逐漸有體會(huì)了。
下面我根據(jù)MARK Lutz的《Learning Python》中的“大師眼中的OOP”,列一些使用OOP的常見原因。
•代碼重用。這是很簡(jiǎn)單(并且是使用OOP的最主要原因)。通過支持繼承,類允許通過定制來編程,而不是每次都從頭開始一個(gè)項(xiàng)目。
•封裝。在對(duì)象接口后包裝其實(shí)現(xiàn)的細(xì)節(jié),從而隔離了代碼的修改對(duì)用戶產(chǎn)生的影響。
•結(jié)構(gòu)。類提供了一個(gè)新的本地作用域,最小化了變量名沖突。他們還提供了一種編寫和查找實(shí)現(xiàn)代碼,以及去管理對(duì)象狀態(tài)的自然場(chǎng)所。
•維護(hù)性。類自然而然地促進(jìn)了代碼的分解,這讓我們減少了冗余。對(duì)虧支持類的結(jié)構(gòu)以及代碼重用,這樣每次只需要修改代碼中一個(gè)拷貝就可以了。
•一致性。類和繼承可以實(shí)現(xiàn)通用的接口。這樣代碼不僅有了統(tǒng)一的外表和觀感,還簡(jiǎn)化了代碼的調(diào)試、理解以及維護(hù)。
•多態(tài)。多態(tài)讓代碼更靈活和有了廣泛的適用性。(這似乎是OOP的屬性,不是使用它的理由)
不管怎么樣,類是一個(gè)非常重要的東西,看官在學(xué)習(xí)的時(shí)候,一定要多加運(yùn)用。
此外,對(duì)于python2來說,還有一個(gè)叫做“新式類”(new-style)的東西,這個(gè)對(duì)應(yīng)于前面講過的類,那么前面講過的類就稱為“經(jīng)典”(classic)類。但是,對(duì)于Python3來講,沒有這種區(qū)別,二者融合。只是在Python2中,兩個(gè)是有區(qū)別的。本教程在基礎(chǔ)部分,依然不講授新式類的問題,如果看官有興趣,可以自己在GOOGLE中查找有關(guān)資料,也可以隨著本課程深入,到下一個(gè)階段來學(xué)習(xí)。
綁定和無綁定方法
看官是否還記得,在學(xué)習(xí)類的方法的時(shí)候,提到過,類的方法就是函數(shù),只不過這個(gè)函數(shù)的表現(xiàn)有點(diǎn)跟前面學(xué)過的函數(shù)不一樣,比如有個(gè)self。當(dāng)然,也不是必須要有的,下面看官就會(huì)看到?jīng)]有self的。既然方法和函數(shù)一樣,本質(zhì)上都是函數(shù),那么,函數(shù)那部分學(xué)習(xí)的時(shí)候已經(jīng)明確了:函數(shù)是對(duì)象,所以,類方法也是對(duì)象。正如剛才說的,類的方法中,有的可以有self,有的可以沒有。為了進(jìn)行區(qū)別,進(jìn)一步做了這樣的定義:
•無綁定類方法對(duì)象:無self
•綁定實(shí)例方法對(duì)象:有self
調(diào)用綁定實(shí)例方法對(duì)象
>>> class MyClass:
... def foo(self,text):
... print text
...
可以用下面的方式調(diào)用實(shí)例方法
>>> a = MyClass() #創(chuàng)建類實(shí)例
>>> a.foo('qiwsir.github.io') #調(diào)用實(shí)例方法
qiwsir.github.io
>>> a.foo
<bound method MyClass.foo of <__main__.MyClass instance at 0xb74495ac>>
在這個(gè)實(shí)例方法調(diào)用的時(shí)候,其數(shù)據(jù)傳遞流程,在《編寫類之二方法》中有一張圖,圖中顯示了,上述的調(diào)用方法中,其實(shí)已經(jīng)將實(shí)例名稱a傳給了self,這就是調(diào)用綁定實(shí)例方法對(duì)象,有self。
上面的調(diào)用過程,還可以這樣來實(shí)現(xiàn):
>>> a = MyClass()
>>> x = a.foo #把實(shí)例a和方法函數(shù)foo綁定在一起
>>> x
<bound method MyClass.foo of <__main__.MyClass instance at 0xb74495ac>>
>>> x("qiwsir.github.io")
qiwsir.github.io
在上面的調(diào)用中,其實(shí)相當(dāng)于前面的調(diào)用過程的分解動(dòng)作。即先將實(shí)例a和方法函數(shù)foo綁定在一起,然后賦值給x,這時(shí)候x就相當(dāng)于一個(gè)簡(jiǎn)單函數(shù)一樣,可以通過上述方式傳入?yún)?shù)。這里將實(shí)例和方法函數(shù)綁定的方式就是運(yùn)用點(diǎn)號(hào)運(yùn)算(object.method_function)
調(diào)用無綁定類方法對(duì)象
所謂類方法對(duì)象,就是不通過實(shí)例,而是用類進(jìn)行點(diǎn)號(hào)運(yùn)算來獲得方法函數(shù)(ClassName.method_function)
>>> a = MyClass()
>>> y = MyClass.foo #這里沒有用類調(diào)用
>>> y
<unbound method MyClass.foo>
這樣的調(diào)用,就得到了無綁定方法對(duì)象,但是,調(diào)用的時(shí)候必須傳入實(shí)例做為第一參數(shù),如下
>>> y(a,"qiwsir.github.io")
qiwsir.github.io
否則,就報(bào)錯(cuò)。請(qǐng)看官特別注意報(bào)錯(cuò)信息
>>> y("qiwsir.github.io")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method foo() must be called with MyClass instance as first argument (got str instance instead)
>>>
在編程實(shí)踐中,似乎用實(shí)例方法調(diào)用更多一下。
文檔字符串
在寫程序的時(shí)候,必須要寫必要的文字說明,沒別的原因,除非你的代碼寫的非常容易理解,特別是各種變量、函數(shù)和類等的命名任何人都能夠很容易理解,否則,文字說明是不可缺少的。
在函數(shù)、類或者文件開頭的部分寫文檔字符串說明,一般采用三重引號(hào)。這樣寫的最大好處是能夠用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)然,在編程中,有不少地方要用“#”符號(hào)來做注釋。一般用這個(gè)來注釋局部。
類其實(shí)并沒有結(jié)束,不過本講座到此對(duì)類暫告一段。看官要多實(shí)踐。
相關(guān)文章
Python基于Ui控件解析的自動(dòng)化實(shí)現(xiàn)微信(關(guān)鍵詞)自動(dòng)回復(fù)
這篇文章主要為大家介紹了Python基于Ui控件解析的自動(dòng)化實(shí)現(xiàn)微信(關(guān)鍵詞)自動(dòng)回復(fù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Python3將數(shù)據(jù)保存為txt文件的方法
這篇文章主要介紹了Python3將數(shù)據(jù)保存為txt文件的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
樹莓派4B+opencv4+python 打開攝像頭的實(shí)現(xiàn)方法
這篇文章主要介紹了樹莓派4B+opencv4+python 打開攝像頭的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Django實(shí)現(xiàn)簡(jiǎn)單的分頁功能
這篇文章主要為大家詳細(xì)介紹了Django實(shí)現(xiàn)分頁功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02
Django自關(guān)聯(lián)實(shí)現(xiàn)多級(jí)聯(lián)動(dòng)查詢實(shí)例
這篇文章主要介紹了Django自關(guān)聯(lián)實(shí)現(xiàn)多級(jí)聯(lián)動(dòng)查詢實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Matplotlib實(shí)戰(zhàn)之平行坐標(biāo)系繪制詳解
平行坐標(biāo)系是一種統(tǒng)計(jì)圖表,它包含多個(gè)垂直平行的坐標(biāo)軸,每個(gè)軸表示一個(gè)字段,并用刻度標(biāo)明范圍,下面我們就來看看如何繪制平行坐標(biāo)系吧2023-08-08

