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、自定義類
創建自定義類的兩種語法:
2.1 屬性與方法
我們從簡單的類 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__() 對其進行初始化。
2.2 繼承與多態
接下來我們新建一個繼承自 Point 類的 Circle 類,添加一個額外的屬性(radius)以及3個新方法,此外重新實現Point類的幾個方法:
Circle 類的繼承關係如下:
02.Circle繼承關係
在 __init__() 方法中,使用 super() 來調用基類的 __init__() 方法,從而創建並初始化 self.x 屬性與 self.y 屬性。下面給出兩個使用實例:
多態意味著,給定類的任意對象在使用時都可以看做該類的任意某個基類的對象,這也是為什麼在創建子類時只需要實現我們需要的附加方法,必須重新實現的也只是那些需要替代的方法。
2.3 使用特性進行屬性存取控制
property()修飾器函數是一個內置函數,至多接受4個參數:一個獲取者函數,一個設置者函數,一個刪除者函數以及一個docstring。
為將屬性轉換為可讀/可寫的特性,我們必須創建一個私有屬性,其中實際上存放了數據並提供獲取者方法與設置者方法。接下來我們對 Circle 類的 radius 屬性進行驗證。
測試:
執行之後會報錯:
這樣就會在創建 Circle 對象時進行驗證了。
本文介紹了 Python 對面向對象程序設計的基礎知識。展示了純過程型程序設計的一些不足,並使用面向對象來克服這些不足。


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