多型性與鴨子型別

2021-10-04 21:48:55 字數 2728 閱讀 4538

多型指的是一類事物有多種形態,比如動物有多種形態:貓、狗、豬

class

animal

:#同一類事物:動物

deftalk

(self)

:pass

class

cat(animal)

:#動物的形態之一:貓

deftalk

(self)

:print

('喵喵喵'

)class

dog(animal)

:#動物的形態之二:狗

deftalk

(self)

:print

('汪汪汪'

)class

pig(animal)

:#動物的形態之三:豬

deftalk

(self)

:print

('哼哼哼'

)#例項化得到三個物件

>>

> cat=cat(

)>>

> dog=dog(

)>>

> pig=pig(

)

多型性指的是可以在不用考慮物件具體型別的情況下而直接使用物件,這就需要在設計時,把物件的使用方法統一成一種:例如cat、dog、pig都是動物,但凡是動物肯定有talk方法,於是我們可以不用考慮它們三者的具體是什麼型別的動物,而直接使用

>>

> cat.talk(

)喵喵喵

>>

> dog.talk(

)汪汪汪

>>

> pig.talk(

)哼哼哼

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

>>

>

deftalk

(animal):.

.. animal.talk().

..>>

> talk(cat)

喵喵喵》

> talk(dog)

汪汪汪》

> talk(pig)

哼哼哼

python中一切皆物件,本身就支援多型性

# 我們可以在不考慮三者型別的情況下直接使用統計三個物件的長度

s.__len__(

)l.__len__(

)t.__len__(

)# python內建了乙個統一的介面

len(s)

len(l)

len(t)

多型性的好處在於增強了程式的靈活性和可擴充套件性,比如通過繼承animal類建立了乙個新的類,例項化得到的物件obj,可以使用相同的方式使用obj.talk()

>>

>

class

wolf

(animal)

:#動物的另外一種形態:狼..

.def

talk

(self):.

..print

('嗷...').

..>>

> wolf=wolf(

)# 例項出一頭狼

>>

> wolf.talk(

)# 使用者根本無需關心wolf是什麼型別而呼叫talk嗷..

.

綜上我們得知,多型性的本質在於不同的類中定義有相同的方法名,這樣我們就可以不考慮類而統一用一種方式去使用物件,可以通過在父類引入抽象類的概念來硬性限制子類必須有某些方法名

import abc

# 指定metaclass屬性將類設定為抽象類,抽象類本身只是用來約束子類的,不能被例項化

class

animal

(metaclass=abc.abcmeta)

: @abc.abstractmethod # 該裝飾器限制子類必須定義有乙個名為talk的方法

deftalk

(self)

:# 抽象方法中無需實現具體的功能

pass

class

cat(animal)

:# 但凡繼承animal的子類都必須遵循animal規定的標準

deftalk

(self)

:pass

cat=cat(

)# 若子類中沒有乙個名為talk的方法則會丟擲異常typeerror,無法例項化

但其實我們完全可以不依賴於繼承,只需要製造出外觀和行為相同物件,同樣可以實現不考慮物件型別而使用物件,這正是python崇尚的「鴨子型別」(duck typing):「如果看起來像、叫聲像而且走起路來像鴨子,那麼它就是鴨子」。比起繼承的方式,鴨子型別在某種程度上實現了程式的松耦合度,如下

#二者看起來都像檔案,因而就可以當檔案一樣去用,然而它們並沒有直接的關係

class

txt:

#txt類有兩個與檔案型別同名的方法,即read和write

defread

(self)

:pass

defwrite

(self)

:pass

class

disk

:#disk類也有兩個與檔案型別同名的方法:read和write

defread

(self)

:pass

defwrite

(self)

:pass

多型性與鴨子型別

class animal pass class people animal pass class dog animal pass class pig animal pass為何要有多型 多型會帶來什麼樣的特性 多型性指的是可以在不考慮物件具體型別的情況下而直接使用物件 class animal 統一...

多型 多型性和鴨子型別

目錄多型指的是同一種事物有多種形態,比如水有液態 固態和氣態。乙個抽象類有多個子類,因而多型的概念依賴於繼承。class animal def talk self pass class dog animal def talk self print 汪汪汪 class cat animal def t...

多型及多型性和鴨子型別

多型及多型性 多型指的是同一類 種事物的不同形態 其實就是繼承關係的表現 多型只是一種格式形態,它的主要體現是多型性 多型性在類中的簡單表現形式 class animal def run self print run fast class mouse animal def sound self pr...