1. 程式人生 > >【我要學python】面對物件程式設計之繼承和多型

【我要學python】面對物件程式設計之繼承和多型

class animal(object):
def run():
print('animal is running...')

class dog(animal):
def run(self):
print('dog is running...')
def eat(self):
print('Eating meat')
class cat(animal):
pass

a=dog() #dog和cat自動擁有了父類animal的run()方法
a.run() #子輩的run()方法覆蓋了父輩的run()方法,從而多型
a.eat() #要理解什麼是多型,我們首先要對資料型別再作一點說明。當我們定義一個class的時候,我們實際上就定義了一種資料型別。我們定義的資料型別和Python自帶的資料型別,比如str、list、dict沒什麼兩樣
cat.run()

class Timer(object):
def run(): #run方法中不能寫self
print('Start...')

d=Timer
d.run()

輸出內容:
dog is running...
Eating meat
animal is running...
Start...

 

我們可以從某個現有的class繼承定義一個class,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)如:class Dog(Animal): 而不是class Dog(object):

好處:1.子類能獲得父類的全部功能,包括父類的方法 2.多型:子類的例項既是屬於子類,也屬於父類。

注意:子類會繼承父類的方法,但當子類有同樣的方法,如run(),子類會覆蓋父類,執行時會呼叫子類的run()

多型好處:只要確認是某型別,就可以呼叫該型別的方法,如果子類例項有同名方法,則呼叫子類方法,否則呼叫父類方法,這樣不必再為子類單獨建立一個函式呼叫方法 如: def run_twice(animal): animal.run() 子類Dog不需要再建立一個函式呼叫Dog.run,而直接使用run_twice(Dog)就行,而且其實是使用子類方法Dog.run。在呼叫時也不需要管內部細節,直接呼叫,執行時會自動根據該物件的確切型別(是否子類,子類是否有同樣方法)決定。 同時,繼承和多型還可以一級一級繼承下去

靜態語言 vs 動態語言 對於靜態語言(例如Java)來說,如果需要傳入Animal型別,則傳入的物件必須是Animal型別或者它的子類,否則,將無法呼叫run()方法

對於動態語言Python來說,則不一定需要傳入Animal型別。我們只需要保證傳入的物件有一個run()方法就可以了

簡單來說就是,動態語言不一定需要傳入Animal型別,而只需要該型別定義了run()的方法就可以呼叫run_twice()。靜態語音如Java則不行,必須傳入Animal型別的