1. 程式人生 > >小白學python之繼承與多型_學習筆記

小白學python之繼承與多型_學習筆記

本文以廖雪峰的官方網站為參考來學習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()方法就可以了:

 

筆記:

小結

繼承可以把父類的所有功能都直接拿過來,這樣就不必重零做起,子類只需要新增自己特有的方法,也可以把父類不適合的方法覆蓋重寫。

動態語言的鴨子型別特點決定了繼承不像靜態語言那樣是必須的。