小白學python之繼承與多型_學習筆記
阿新 • • 發佈:2018-11-13
本文以廖雪峰的官方網站為參考來學習python的。其學習連結為廖雪峰小白學python教程。
本文是學習到python的繼承與多型。參考連結廖雪峰python繼承與多型。
class Animal(object): def run(self): print('Animal is running...') def eat(self): print('Eating meat...') class Dog(Animal): def run(self): print('Dog is running...') class Cat(Animal): def run(self): print('Cat is running...') dog = Dog() dog.run() cat = Cat() cat.run()
輸入上列程式碼,可以得到結果:
Dog is running...
Cat is running...
a = list()
b = Animal()
c = Dog()
print(isinstance(a, list))
print(isinstance(b, Animal))
print(isinstance(c, Dog))
執行程式後,結果為:
True
True
True
print(isinstance(c,Animal))
b = Animal()
print(isinstance(b,Dog))
執行程式後,結果為:
True
False
筆記:在繼承關係中,如果一個例項的資料型別是某個子類,那它的資料型別也可以被看做是父類。但是,反過來就不行。
def run_twice(animal):
animal.run()
animal.run()
run_twice(Animal())
run_twice(Dog())
run_twice(Cat())
class Tortoise(Animal):
def run(self):
print('Tortoise is running slowly...')
run_twice(Tortoise())
執行結果為:
Animal is running...
Animal is running...
Dog is running...
Dog is running...
Cat is running...
Cat is running...
Tortoise is running slowly...
Tortoise is running slowly...
筆記:
“開閉”原則:
對擴充套件開放:允許新增Animal
子類;
對修改封閉:不需要修改依賴Animal
型別的run_twice()
等函式。
筆記:
靜態語言 vs 動態語言
對於靜態語言(例如Java)來說,如果需要傳入Animal
型別,則傳入的物件必須是Animal
型別或者它的子類,否則,將無法呼叫run()
方法。
對於Python這樣的動態語言來說,則不一定需要傳入Animal
型別。我們只需要保證傳入的物件有一個run()
方法就可以了:
筆記:
小結
繼承可以把父類的所有功能都直接拿過來,這樣就不必重零做起,子類只需要新增自己特有的方法,也可以把父類不適合的方法覆蓋重寫。
動態語言的鴨子型別特點決定了繼承不像靜態語言那樣是必須的。