天天看點

Python進階7-面向對象程式設計、類

一、面向對象程式設計

面向對象--Object Oriented Programming,簡稱oop,是一種程式設計思想。在說面向對象之前,先說一下什麼是程式設計範式,程式設計範式你按照什麼方式來去程式設計,去實作一個功能。舉個例子,你要做飯,可以用電磁爐,也可以用瓦斯竈。不同的程式設計範式本質上代表對各種類型的任務采取的不同的解決問題的思路,兩種最重要的程式設計範式分别是面向過程程式設計和面向對象程式設計。

提到面向對象,就不得不提到另一種程式設計思想,面向過程;什麼是面向過程呢,面向過程的思想是把一個項目、一件事情按照一定的順序,從頭到尾一步一步地做下去,先做什麼,後做什麼,一直到結束。這種思想比較好了解,其實這也是一個人做事的方法,我們之前程式設計的思想也都是使用這種思想。這種程式設計思想,隻要前面有一個步驟變了,那麼後面的就也要變,後面維護起來比較麻煩,這樣的程式設計思想,我們在寫一些簡單的小程式、隻執行一次的腳本時可以使用。而面向對象呢,面向對象的思想是把一個項目、一件事情分成更小的項目,或者說分成一個個更小的部分,每一部分負責什麼方面的功能,最後再由這些部分組合而成為一個整體。這種思想比較适合多人的分工合作,就像一個大的機關,分各個部門,每個部門分别負責某樣職能,各個部門可以充分發揮自己的特色,隻要符合一定前提就行了。

舉個例子:比如剛才說的一個大的機關,要做某一個項目,從面向過程的思想來說,應該是這樣分析的,先怎麼樣,再怎麼樣,最後怎麼樣。第一樣應該如何完成,第二樣應該如何完成等等。等到每一步驟都完成,項目也就完成了。而面向對象的思想則應該是這樣想的,這個項目是由幾個部分組成的,我們就做好分工,成立一個部門來做一個部分的功能,另一個部門來做另一個部分。各個部門可以不用了解其他部門的事,隻要完成自己那一部分的事情就OK了。

二、面向對象的特性

類:class

類,對比現實世界來說就是一個種類,一個模型。

一個類即是對一類擁有相同屬性的對象的抽象、藍圖、原型。

在類中定義了這些對象的都具備的屬性(variables(data))、共同的方法。

對象:object

對象,也就是指模型造出來的具體的東西。

一個對象即是一個類的執行個體化後執行個體,一個類必須經過執行個體化後方可在程式中調用,一個類可以執行個體化多個對象,每個對象亦可以有不同的屬性,就像人類是指所有人,每個人是指具體的對象,人與人之前有共性,亦有不同。

執行個體化:

初始化一個類,造了一個對象。把一個類變成一個具體的對象的過程,叫做執行個體化。

封裝:

把一些功能的實作細節不對外暴露,類中對資料的指派、内部調用對外部使用者是透明的,這使類變成了一個膠囊或容器,裡面包含着類的資料和方法。

比如說造的一個人,你把他身體内部的什麼心肝脾肺腎都封裝起來了,其他人都看不到,你直接找這個人。

繼承:

一個類可以派生出子類,在這個父類裡定義的屬性、方法自動被子類繼承。比如說你繼承了你父親的姓。

python3中多繼承都是廣度優先,python2中經典類的多繼承是深度優先,新式類的多繼承是按照廣度優先的。

繼承是為了代碼的重用

多态:

對不同類的對象發出相同的消息将會有不同的行為。比如,你的老闆讓所有員工在九點鐘開始工作, 他隻要在九點鐘的時候說:“開始工作”即可,而不需要對銷售人員說:“開始銷售工作”,對技術人員說:“開始技術工作”, 因為“員工”是一個抽象的事物, 隻要是員工就可以開始工作,他知道這一點就行了。至于每個員工,當然會各司其職,做各自的工作。

多态就是抽象化的一種展現,把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物進行對話。

一種接口,多種實作。

三、面向對象的好處

對于程式設計語言的初學者來講,OOP不是一個很容易了解的程式設計方式,大家雖然都按老師講的都知道OOP的三大特性是繼承、封裝、多态,并且大家也都知道了如何定義類、方法等面向對象的常用文法,但是一到真正寫程式的時候,還是很多人喜歡用函數式程式設計來寫代碼,特别是初學者,很容易陷入一個窘境就是“我知道面向對象,我也會寫類,但我依然沒發現在使用了面向對象後,對我們的程式開發效率或其它方面帶來什麼好處,因為我使用函數程式設計就可以減少重複代碼并做到程式可擴充了,為啥子還用面向對象?”對于此,我個人覺得原因應該還是因為你沒有充分了解到面向對象能帶來的好處。

無論用什麼形式來程式設計,我們都要明确記住以下原則:

寫重複代碼是非常不好的低級行為

你寫的代碼需要經常變更

開發正規的程式跟那種寫個運作一次就扔了的小腳本一個很大不同就是,你的代碼總是需要不斷的更改,不是修改bug就是添加新功能等,是以為了日後友善程式的修改及擴充,你寫的代碼一定要遵循易讀、易改的原則(專業資料叫可讀性好、易擴充)。

如果你把一段同樣的代碼複制、粘貼到了程式的多個地方以實作在程式的各個地方調用,這個功能,那日後你再對這個功能進行修改時,就需要把程式裡多個地方都改一遍,這種寫程式的方式是有問題的,因為如果你不小心漏掉了一個地方沒改,那可能會導緻整個程式的運作都 出問題。 是以我們知道 在開發中一定要努力避免寫重複的代碼,否則就相當于給自己再挖坑。

還好,函數的出現就能幫我們輕松的解決重複代碼的問題,對于需要重複調用的功能,隻需要把它寫成一個函數,然後在程式的各個地方直接調用這個函數名就好了,并且當需要修改這個功能時,隻需改函數代碼,然後整個程式就都更新了。

其實OOP程式設計的主要作用也是使你的代碼修改和擴充變的更容易,那麼小白要問了,既然函數都能實作這個需求了,還要OOP幹毛線用呢? 呵呵,說這話就像,古時候,人們打仗殺人都用刀,後來出來了槍,它的主要功能跟刀一樣,也是殺人,然後小白就問,既然刀能殺人了,那還要槍幹毛線,哈哈,顯而易見,因為槍能更好更快更容易的殺人。函數程式設計與OOP的主要差別就是OOP可以使程式更加容易擴充和易更改。

四、類

一些概念:

屬性:屬性就是類裡面的一個變量,有類變量和執行個體變量,類變量是類在定義的時候就有的,執行個體變量是在執行個體化的時候才産生的變量。這個可以了解為,人是一個類,他的名字、年齡、性别就是它的屬性。

方法:方法就是類的功能,也就是定義在類裡面的函數,它實作了某個功能,比如說人有睡覺的功能。

構造函數:什麼是構造函數,就是類在執行個體化的時候做的某些初始化操作,比如說人,你造一個汽車的時候,它得有顔色、型号等等。

析構函數:析構函數就是這個執行個體在銷毀的時候做的一些操作。

定義類:

定義類使用class關鍵字,類名一般我們開發的時候首字母要大寫。python中有經典類和新式類,他倆在python3中沒有差別,在python2中經典類在多繼承的時候是深度優先,新式類是廣度優先。python3中統一是廣度優先,這個後面在說繼承的時候會說。

多态:python裡面是不直接支援多态的,可以通過别的方法來實作多态。通過下面的例子就可以實作一種接口,多種實作,對于下面的cry方法來說,不管你傳入的是什麼對象,隻要有cry的方法,都會去調用它的cry方法,不用再一個個的去調用了。

私有方法、私有屬性:

什麼是私有,私有就是隻有在類裡面可以通路,執行個體化之後不可以通路和調用,有私有方法和私有屬性。私有就把變量名或者函數名前面加上"__"兩個下劃線,其實就是通過私有來實作封裝的。

靜态方法和類方法: