物件導向之多型

2022-07-30 07:18:12 字數 1869 閱讀 6557

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

class animal:  #

統一所有子類的方法

defsay(self):

print('

動物基本的發聲...')

class

people(animal):

defsay(self):

super(people, self).say()

print('

嚶嚶嚶'

)class

dog(animal):

defsay(self):

super(dog, self).say()

print('

汪汪汪'

)class

pig(animal):

defsay(self):

super(pig, self).say()

print('

哼哼哼'

)obj1 =animal()

obj2 =dog()

obj3 = pig()

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

#

定義統一的介面, 接收傳入的動物物件

defanimal_say(animal):

animal.say()

animal_say(obj1)

animal_say(obj2)

animal_say(obj3)

其實我們完全可以不依賴於繼承,只需要製造出外觀和行為相同物件,同樣可以實現不考慮物件型別而使用物件,這正是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

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

import abc

#抽象化父類

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

class animal(metaclass=abc.abcmeta):

@abc.abstractmethod

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

def talk(self): #

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

pass

class cat(animal): #

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

deftalk(self):

pass

obj = animal() #

不能例項化抽象類自己

cat = cat() #

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

物件導向之多型

多型即事物存在的多種形態 要有繼承 要有方法重寫 要有父類引用指向子類物件 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 動物的形態之一 人...