天天看點

Python OOP知識積累目錄前言對象類面向對象Python 面向對象程式設計三個基本特征最後

<a href="#%E7%9B%AE%E5%BD%95">目錄</a>

<a href="#%E5%89%8D%E8%A8%80">前言</a>

<a href="#%E5%AF%B9%E8%B1%A1">對象</a>

<a href="#%E7%B1%BB">類</a>

<a href="#%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1">面向對象</a>

<a href="#python-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%BC%96%E7%A8%8B%E4%B8%89%E4%B8%AA%E5%9F%BA%E6%9C%AC%E7%89%B9%E5%BE%81">Python 面向對象程式設計三個基本特征</a>

<a href="#%E5%B0%81%E8%A3%85">封裝</a>

<a href="#%E7%BB%A7%E6%89%BF">繼承</a>

<a href="#%E7%BB%A7%E6%89%BF%E7%9A%84%E4%BD%9C%E7%94%A8">繼承的作用</a>

<a href="#%E6%B3%9B%E5%8C%96%E4%B8%8E%E7%89%B9%E5%8C%96">泛化與特化</a>

<a href="#%E5%AE%9E%E7%8E%B0%E7%BB%A7%E6%89%BF%E7%9A%84%E6%96%B9%E5%BC%8F">實作繼承的方式</a>

<a href="#%E5%A4%9A%E9%87%8D%E7%BB%A7%E6%89%BF">多重繼承</a>

<a href="#%E5%A4%9A%E6%80%81">多态</a>

<a href="#%E6%96%B9%E6%B3%95%E5%A4%9A%E6%80%81">方法多态</a>

<a href="#%E6%9C%80%E5%90%8E">最後</a>

在計算機領域中,對象是人們要進行研究的任何事物,它表示具體的事物,此外也表示抽象的規則、計劃或事件。對象是資料和操作資料的方法的結合。

對象的狀态(資料):一個對象用資料值來描述它的狀态,也稱為對象屬性。

對象的行為(操作):對象的行為用于改變對象的狀态,也稱為對象方法。

對象唯一性(句柄):即對象名稱,每個對象都有自身唯一的辨別,通過這種辨別,可找到相應的對象。在對象的整個生命期中,它的辨別都不改變。

對象之間的通信:對象之間進行通信的結構叫做消息,當一個消息發送給某個對象時,消息應該包含下面幾種資訊:

1. 接受消息的對象名(目的對象名)。

2. 接收對象去執行某種操作的資訊(調用方法名)。

3. 發送給該對象的參數,參數可以是該對象私有的變量名,或者是所有對象都知道的全局變量名。

4. 發送給該對象的消息名(源消息名)。

具有相同特性(資料元素)和行為(方法)的對象的抽象就是類,類本質是一種資料結構。對象的抽象是類,類的具體個性化就是對象。

類的屬性:它是對象的狀态的抽象,用資料結構來描述類的屬性,也稱為成員屬性。

類的方法:它是對象的行為的抽象,用操作名和實作該操作的方法來描述,也稱為成員方法。

類的結構:在客觀世界中有若幹類,這些類之間有一定的結構關系。通常有下面兩種主要的結構關系:

1. 一般/具體結構稱為分類結構,也可以說是is a關系。用來描述在繼承中子類與父類的關系,即一個派生子類的執行個體化對象是其父類的一個”例子”。是以有”is a”的關系。

2. 整體/部分結構稱為組裝結構,它們之間的關系是has a關系。”組合”是實作繼承的方式之一,在”組合”繼承中,一個子類可以有多個父類,即一個子類”has a”一個父類。

面向對象(Object Oriented,OO),面向對象是一種對現實世界了解和抽象的方法,是計算機程式設計技術發展到一定階段後的産物。在Python中一切皆對象,通過面向對象的思維,将現實世界的事物都抽象成為對象,将現實世界中的關系抽象成類、繼承,幫助人們實作對現實世界的抽象與數字模組化。通過面向對象的方法,更利于用人了解的方式對複雜系統進行分析、設計與程式設計。而且,面向對象能有效提高程式設計的效率,通過封裝技術,消息機制可以像搭積木的一樣快速開發出一個全新的系統。其中對象是類的集合,面向對象思維将對象作為程式的基本單元,将程式和資料封裝其中,以提高軟體的重用性、靈活性和可擴充性。

面向對象程式設計踏上了進化的階梯,增強了結構化程式設計,實作了資料與動作的融合:資料層和邏輯層現在由一個可用以建立這些對象的簡單抽象層來描述。

OO後來又擴充為OOA/OOD/OOP:

OOA(Object Oriented Analysis)面向對象分析:即根據抽象關鍵的問題域來分解系統。

OOD(Object Oriented Design)面向對象設計:是一種提供符号設計系統的面向對象的實作過程,它用非常接近實際領域術語的方法把系統構造成“現實世界”的對象。

OOP(Object Oriented Programming)面向對象程式設計:是一種程式設計範型,同時也是一種程式開發的方法,實作OOP的程式希望能夠在程式中包含各種獨立而又互相調用的對象,每一個對象又都應該能夠接受資料、處理資料并将資料傳達給其它對象,是以每個對象都可以被看作一個小型的”機器”,而整個程式系統就是由這些小機器互相協助、組合建構起來的。

封裝描述了對資料/資訊進行隐藏的觀念,它對資料屬性提供接口(接口函數)和通路方法。在類的設計時,為資料提供了相應的接口,以免客戶程式通過不規範的操作來存取封裝的資料屬性。

封裝的目的:就是把客觀事物抽象并封裝成類,封裝好的每一個類都是獨立的,而由類執行個體化建立的對象亦是如此。對象之間隻能通過 消息 這種通信結構來實作通訊。這樣做能夠實作:類自己的資料和方法隻讓可信的類或者對象操作,對不可信操作的進行資訊隐藏。為類和對象中的方法、屬性提供了安全的保障。

封裝的作用:一個類就是一個封裝了資料以及操作這些資料的方法的邏輯實體。在一個對象内部,某些方法或屬性可以是私有的(執行個體化對象将類中定義的私有屬性和方法個性化),它們不能被外界通路。通過封裝,為對象内部的資料提供了不同級别的保護,以防止程式中無關的部分意外的改變或錯誤的使用了對象的私有部分。即隐藏類的功能實作的細節,使代碼子產品化(松耦合、高内聚)。

封裝的意義:一般的,我們會認為程式=資料結構+算法,在OOP中,因為封裝的存在,我們會将這條等式轉化為程式=對象+消息。

OUTPUT:

上面的例子是一個簡單的封裝,在Class中定義了各種不同類型的方法和屬性,他們都有着屬于自己的命名空間和通路限制。

公有屬性:類内外都可以被通路

私有屬性:隻能被類内函數調用,以’__’開頭。

内置屬性:系統在定義類時預設添加,命名格式為’__X__’

繼承令不同類之間擁有了一定的結構與關系。

類之間的關系:

1. 通過繼承建立的新類稱為”子類”或”派生類”

2. 被繼承的類稱為”基類”、”父類”或”超類”

通過繼承得來的子類能夠保留父類中所有需要的資料和行為,同時允許修改或者其他自定義的操作,這些都不會影響到父類。換句話說,繼承的新類(子類),能夠使用被繼承類(父類)的所有功能,并且繼承後的子類能夠在無需重寫這些屬性和方法的情況下對父類的功能進行擴充。是以說,繼承就是從一般(父類)到特殊(子類)的過程。是以繼承最明顯的好處在于代碼的複用。

泛化表示所有的子類與其父類及祖先類有着一樣的特點。

特化描述所有的子類的自定義,也就是,什麼屬性讓它與其父類一同。

要實作繼承,可以通過”繼承”(Inheritance)和”組合”(Composition)來實作。其中”繼承”又有實作繼承和可視繼承,”組合”又有接口繼承和純虛類。

實作繼承:子類的屬性和方法完全繼承于父類。

可視繼承:子類繼承父類的外觀和方法。

接口繼承:子類的屬性明和方法名繼承于父類,但是具體的屬性值和方法實作由子類重寫。

OUTPUT:

Python支援多重繼承,即’組合’繼承。在Java或C#中使用接口的概念來實作多重繼承的效果。而在Python中在定義類的時候,可以直接繼承多個父類來實作多重繼承。

上面例子中由類RobotCat()執行個體化的對象robot,具有由兩個父類組合而成的屬性和方法。

注意:在實作多重繼承時,如果繼承的多個父類中均有名稱相同的方法時,要注意繼承的順序。

多态的概念指出了不同的對象如何通過他們共同的屬性和動作來操作以及通路,而不需考慮他們具體的類,多态表明了動态綁定(運作時)的存在,允許重載及運作時類型确定和驗證。

多态就是指不同的類執行個體(對象)都擁有相同方法和屬性,而這些相同的方法和屬性在不同情形有着不同的表現形式。多态機制使不同的對象可以共享相同的外部接口(屬性名、方法名)。這意味着,雖然針對不同對象的具體操作(方法實作)不同,但通過一個公共的類,它們可以通過相同的方式(屬性名、變量名)予以調用。即在不同的對象中可以定義同名屬性或方法,但是屬性值或方法實作卻是各不相同的。

多态的作用:實作了接口重用,保證了在類發生繼承或派生時,我們仍然能夠正确的調用這些相關類的執行個體化對象的屬性和方法。

從結果中可以看出,我們在調用了不同的對象的相同的方法時,這個方法有着不一樣的表現形式。

再舉一個栗子:Duck Typing

在了解了OOP的基本知識後,就繼續通過代碼實作來加深了解吧。 : -)