當前位置:
首頁 > 最新 > Python指南:面向對象程序設計

Python指南:面向對象程序設計

Rage Your Dream

 Rage your dream/around the world

m.o.v.e 

00:00/04:35

Python 是一種多泛型語言,它沒有強製程序員使用某種特定的程序設計風格,而是允許程序員採用過程型、函數型或面向對象的程序設計風格,也可以是這些編程風格的有效組合。對於大多數程序而言,尤其對中等規模或大規模的程序,採用面向對象的程序設計風格提供了很多優勢。


1、面向對象方法

接下來將基於使用程序對圓進行描述這一問題,來解釋純過程型程序設計方法存在的問題。用於描述一個圓所需要的最少數據包括圓心坐標(x, y)以及圓的半徑,簡單的方法是使用一個三元組對圓進行描述,比如: 。

如果只給出這個表示,那麼我們可以理解為, 也可以理解為,二義性是其一個不足之處。另外一個不足在於,只能通過索引位置對其中的值進行存取,還是得提前知道元組中每個位置所代表的含義。

可以使用namedtuple解決獲取元素順序的問題(假設distance_from_origin函數已定義):

雖然可以解決元素順序的問題,但是如果半徑給定的值為負值,這個數據是不合理的,假設會在distance_from_origin函數中進行檢查,但這隻有在調用的時候才能檢查,並不能在創建 Circle 對象的時候進行驗證,這就是純過程型程序設計的弊端。

對象:我們之前見過的 dict、int、str 等數據類型其實是一個類,我們也可以稱之為一個 對象。

對象中通常包含屬性——方法是可調用的屬性,其他屬性則是數據。方法其實也是一個函數,只不過其第一個參數是調用該方法的實例本身(self)。在屬性名前以兩個下劃線引導,Python就會阻止無心的訪問,因此可以認為是私有的。

面向對象的優勢之一是如果我們有一個類,就可以對其進行專用化,這意味著創建一個新類,新類繼承原始類的所有屬性(數據和方法),通常可以添加或替換原始類中的某些方法,或添加更多的實例變數。


2、自定義類

創建自定義類的兩種語法:


我們從簡單的類 Point 開始,該類存放坐標 (x, y),定義於文件 Shape.py 中,其完整實現如下:

Point 類有兩個數據屬性(self.x和self.y),還包含5個方法(不包括繼承來的方法),其中4個屬於特殊方法。導入 Shape 模塊後, Point 類就可以像其他類一樣進行使用,其屬性可以直接存取。

01.Point繼承關係

對 Point 類的基本使用:

對方法進行調用時,Python 會自動提供第一個參數——這個參數是對對象自身的對象引用(在 C++ 與 Java 中稱為 this)。我們必須在參數列表中包含這一參數,根據約定,這一參數稱為self。所有的對象屬性都必須由self進行限定。

創建一個對象,需要兩個步驟:調用特殊方法 __new__() 來創建該對象,之後調用特殊方法 __init__() 對其進行初始化。

接下來我們新建一個繼承自 Point 類的 Circle 類,添加一個額外的屬性(radius)以及3個新方法,此外重新實現Point類的幾個方法:

Circle 類的繼承關係如下:

02.Circle繼承關係

在 __init__() 方法中,使用 super() 來調用基類的 __init__() 方法,從而創建並初始化 self.x 屬性與 self.y 屬性。下面給出兩個使用實例:

多態意味著,給定類的任意對象在使用時都可以看做該類的任意某個基類的對象,這也是為什麼在創建子類時只需要實現我們需要的附加方法,必須重新實現的也只是那些需要替代的方法。


property()修飾器函數是一個內置函數,至多接受4個參數:一個獲取者函數,一個設置者函數,一個刪除者函數以及一個docstring

為將屬性轉換為可讀/可寫的特性,我們必須創建一個私有屬性,其中實際上存放了數據並提供獲取者方法與設置者方法。接下來我們對 Circle 類的 radius 屬性進行驗證。

測試:

執行之後會報錯:

這樣就會在創建 Circle 對象時進行驗證了。

本文介紹了 Python 對面向對象程序設計的基礎知識。展示了純過程型程序設計的一些不足,並使用面向對象來克服這些不足。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

Python黑客不得不提的三個滲透腳本,我卻偷偷曝光是不是不厚道?
史上最全Python知識點匯總續

TAG:Python |