DAY7 物件導向之多型與多型性

2022-07-24 22:06:19 字數 3149 閱讀 6672

多型指的是一類事物有多種形態

動物有多種形態:人,狗,豬

import

abcclass animal(metaclass=abc.abcmeta): #

同一類事物:動物

@abc.abstractmethod

deftalk(self):

pass

class people(animal): #

動物的形態之一:人

deftalk(self):

print('

say hello')

class dog(animal): #

動物的形態之二:狗

deftalk(self):

print('

say wangwang')

class pig(animal): #

動物的形態之三:豬

deftalk(self):

print('

say aoao

')

import

abcclass file(metaclass=abc.abcmeta): #

同一類事物:檔案

@abc.abstractmethod

defclick(self):

pass

class text(file): #

檔案的形態之一:文字檔案

defclick(self):

print('

open file')

class exefile(file): #

檔案的形態之二:可執行檔案

defclick(self):

print('

execute file

')

一 什麼是多型動態繫結(在繼承的背景下使用時,有時也稱為多型性)

多型性是指在不考慮例項型別的情況下使用例項

在物件導向方法中一般是這樣表述多型性:向不同的物件傳送同一條訊息(!!!obj.func():是呼叫了obj的方法func,又稱為向obj傳送了一條訊息func),不同的物件在接收時會產生不同的行為(即方法)。也就是說,每個物件可以用自己的方式去響應共同的訊息。所謂訊息,就是呼叫函式,不同的行為就是指不同的實現,即執行不同的函式。

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

view code

多型性分為靜態多型性和動態多型性

靜態多型性:如任何型別都可以用運算子+進行運算

動態多型性:如下

peo=people()

dog=dog()

pig=pig()

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

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

peo.talk()

dog.talk()

pig.talk()

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

deffunc(obj):

obj.talk()

二 為什麼要用多型性(多型性的好處)

其實大家從上面多型性的例子可以看出,我們並沒有增加什麼新的知識,也就是說python本身就是支援多型性的,這麼做的好處是什麼呢?

1.增加了程式的靈活性

以不變應萬變,不論物件千變萬化,使用者都是同一種形式去呼叫,如func(animal)

2.增加了程式額可擴充套件性

通過繼承animal類建立了乙個新的類,使用者無需更改自己的**,還是用func(animal)去呼叫 

>>> class cat(animal): #

屬於動物的另外一種形態:貓

... def

talk(self):

...

print('

say miao')

...

>>> def func(animal): #

對於使用者來說,自己的**根本無需改動

... animal.talk()

...

>>> cat1=cat() #

例項出乙隻貓

>>> func(cat1) #

甚至連呼叫方式也無需改變,就能呼叫貓的talk功能

say miao

'''這樣我們新增了乙個形態cat,由cat類產生的例項cat1,使用者可以在完全不需要修改自己**的情況下。使用和人、狗、豬一樣的方式呼叫cat1的talk方法,即func(cat1)

'''

逗比時刻:

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

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

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

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

#

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

class

txtfile:

defread(self):

pass

defwrite(self):

pass

class

diskfile:

defread(self):

pass

defwrite(self):

pass

view code

#

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,如何用?例如 import abc class animal metaclass abc.abcme...

物件導向之多型 多型性

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

Python學習 物件導向之多型 多型性

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