物件導向 三大特性之多型

2022-08-20 15:21:11 字數 1826 閱讀 1061

在python當中  處處是多型  一切皆物件

廣義的多型

乙個類能表現出的多種形態

木頭 桌子 板凳

使用者 vip使用者 svip使用者

在物件導向方法中一般是這樣表述多型性:

向不同的物件傳送同一條訊息(!!!obj.func():是呼叫了obj的方法func,又稱為向obj傳送了一條訊息func),不同的物件在接收時會產生不同的行為(即方法)。

也就是說,每個物件可以用自己的方式去響應共同的訊息。所謂訊息,就是呼叫函式,不同的行為就是指不同的實現,即執行不同的函式。

比如:老師.下課鈴響了(),學生.下課鈴響了(),老師執行的是下班操作,學生執行的是放學操作,雖然二者訊息一樣,但是執行的效果不同

peo=people()

dog=dog()

pig=pig()

#peo、dog、pig都是動物,只要是動物肯定有talk方法

#於是我們可以不用考慮它們三者的具體是什麼型別,而直接使用

peo.talk()

dog.talk()

pig.talk()

#更進一步,我們可以定義乙個統一的介面來使用

deffunc(obj):

obj.talk()

在其它語言中

在傳遞引數時,如果要傳遞的物件有可能是多個類的物件

我們又必須在語言中清楚的描述出到底是哪乙個類的物件

我們就可以使用繼承的方式

有乙個父類作為這些所有可能被傳遞進的物件的基類

基礎型別就可以寫成這個父類

於是所有子類的物件都屬於父類

在python中

在python中因為要傳遞物件的型別在定義階段不需明確,所以在python中處處是多型  

資料型別不需要繼承來維護統一

鴨子型別

python當中寫程式的一種特殊的情況

python崇尚鴨子型別,即『如果看起來像、叫聲像而且走起路來像鴨子,那麼它就是鴨子』

python程式設計師通常根據這種行為來編寫程式。例如,如果想編寫現有物件的自定義版本,可以繼承該物件

也可以建立乙個外觀和行為像,但與它無任何關係的全新物件,後者通常用於儲存程式元件的松耦合度。

例1:利用標準庫中定義的各種『與檔案類似』的物件,儘管這些物件的工作方式像檔案,但他們沒有繼承內建檔案物件的方法

例2:序列型別有多種形態:字串,列表,元組,但他們直接沒有直接的繼承關係

#

二者都像鴨子,二者看起來都像檔案,因而就可以當檔案一樣去用

class

txtfile:

defread(self):

pass

defwrite(self):

pass

class

diskfile:

defread(self):

pass

defwrite(self):

pass

其他語言中 正常的我們說乙個資料型別具有某個特點,通常是通過繼承來實現

繼承迭代器類,來證明自己本身是個迭代器

繼承可雜湊的類,來證明自己本事是可雜湊的

但是所有的這些都不是通過繼承來完成的

我們只是通過一種潛規則的約定,如果具有__iter__,__next__就是迭代器

如果具有__hash__方法就是可雜湊

如果具有__len__就是可以計算長度的

這樣資料型別之間的關係並不僅僅是通過繼承來約束的

而是通過約定俗成的關係來確認的

物件導向三大特性之多型

多型 同乙個物件在不同時刻表現出來的不同狀態。多型的前提和體現 存在繼承關係或者實現關係 這裡的實現是指介面間的關係 有方法的重寫。有父類引用指向子類物件。多型中成員的訪問特點 訪問成員變數時 首先定義乙個動物類 其次定義乙個子類來繼承它 定義乙個測試類 由此可見當我們用多型的形式去訪問類中的成員變...

物件導向三大特性之多型

本想自己寫 但是發現乙個更好的。抽象類的多型 場景描述 一位剛畢業的老師,目前只能通過騎車上班,多年後終於坐騎公升級了,有了自己的小汽車,於是騎著小汽車上班。騎自行車上班 1.自行車類 public class bike public void stop 2.教師類 public class tea...

物件導向三大特性之多型

多型更像是一種思想,而並非具體的技術。因為繼承的存在,從而引發了多型,python本就是多型的形式,就像現實世界一樣。都是起源於某一單細胞生物但是經過不斷的演化差異化越來越大。多型的定義即是 在不同的類中例項化得到的物件下的相同的方法,實現的過程不一樣。這個就很有意思了.多型的前提是必須有繼承的支援...