物件導向之多型

2022-06-20 03:57:13 字數 2601 閱讀 1975

多型的概念

多型指的是一類事物的多種形態,例如水有固態、液態、氣態,動物有人、狗、豬,這是動物的不同形態。可能你會領悟,人狗豬不是繼承於動物類嗎?沒錯,多型在程式中的表現形式就是依賴於繼承

多型性

那多型到底有什麼特性呢?多型性指的是可以在不用考慮物件具體型別的前提下,直接使用物件下的方法,也就是說,繼承同乙個類的多個子類有相同的方法名,那麼子類產生的物件就可以不用考慮具體的型別而直接呼叫物件的方法

舉乙個例子,動物有人狗豬,動物都會叫,那麼人狗豬也都會叫,只不過叫的方式不同

class

animal:

pass

class

people(animal):

defspeak(self):

print('

say hello')

class

dog(animal):

defspeak(self):

print('

汪汪汪'

)class

pig(animal):

defspeak(self):

print('

哼哼哼')#

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

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

peo =people()

dog1 =dog()

pig1 =pig()

peo.speak()

dog1.speak()

pig1.speak()

view code

但是美中不足的是,如果現在人的叫不寫成 speak ,寫成 talk,那麼便無法遵循父類的方法去實現多型性,如果這三個都想實現叫的功能,父類要有,子類也要有,這顯然很麻煩,並且這樣寫不能對子類有個強制性的限制,這個限制是子類必須有乙個叫的功能,這個功能是 speak。於是要寫乙個解決方案,強制子類遵循父類的標準,有乙個 abc 的模組,可以實現這個功能

import

abcclass animal(metaclass=abc.abcmeta):

@abc.abstractmethod

defspeak(self):

pass

class

people(animal):

#def speak(self):

#print('say hello')

#寫成talk便會報錯

deftalk(self):

print('

say hello')

class

dog(animal):

defspeak(self):

print('

汪汪汪'

)class

pig(animal):

defspeak(self):

print('

哼哼哼'

)peo =people()

dog1 =dog()

pig1 =pig()

peo.speak()

dog1.speak()

pig1.speak()#執行

typeerror: can'

t instantiate abstract class people with abstract methods speak

view code

鴨子型別

但是上面所說的這些並不是 python 所推崇的,python 崇尚的是 「鴨子型別」 ,即 「如果看起來像鴨子、叫聲像鴨子而且走起路來也像鴨子,那麼它就是鴨子」,

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

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

#

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

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

class

txtfile:

defread(self):

pass

defwrite(self):

pass

class

diskfile:

defread(self):

pass

defwrite(self):

pass

#例2:其實大家一直在享受著多型性帶來的好處,比如python的序列型別有多種形態:字串,列表,元組,多型性體現如下

#str,list,tuple都是序列型別

s=str('

hello')

l=list([1,2,3])

t=tuple((4,5,6))

#我們可以在不考慮三者型別的前提下使用s,l,t

s.__len__

()l.

__len__

()t.

__len__

()len(s)

len(l)

len(t)

view code

物件導向之多型

多型即事物存在的多種形態 要有繼承 要有方法重寫 要有父類引用指向子類物件 1,多型中的成員訪問特點之成員變數 編譯看左邊 父類 執行看左邊 父類 2,多型中的成員訪問特點之成員方法 編譯看左邊 父類 執行看右邊 子類 3,多型中的成員訪問特點之靜態成員方法 編譯看左邊 父類 執行看左邊 父類 總結...

物件導向之多型

多型指的是一類事物有多種形態,多型性是指在不考慮例項型別的情況下使用例項 class animals def run self print running class dog animals def run self print dog is running class pig animals de...

物件導向之多型

多型指的是一類事物有多種形態 動物有多種形態 人,狗,豬 import abc class animal metaclass abc.abcmeta 同一類事物 動物 abc.abstractmethod deftalk self pass class people animal 動物的形態之一 人...