Python學習之繼承和多型
阿新 • • 發佈:2021-08-06
在OOP程式設計中,當我們定義一個class的時候,可以從某個現有的class繼承,新的class稱為子類,而被繼承的class稱為基類、父類或超類。
例項:
定義一個Animal類,具有sleep行為。
class Animal(object): def __init__(self): pass def sleep(self): print("animal is sleeping")
定義一個Cat類和Dog類,分別繼承Animal類,Cat和Dog具有特定的行為
class Cat(Animal): def __init__(self):pass def eat(self): print("cat eat fish")
class Dog(Animal): def __init__(self): pass def eat(self): print("dog eat meet")
Cat和Dog繼承了Animal的sleep行為,所以Cat和Dog的例項變數也可以呼叫Animal的sleep方法。
animal = Animal() animal.sleep() cat = Cat() cat.sleep() cat.eat() dog = Dog() dog.sleep() dog.eat()
那麼對於sleep行為,Cat和Dog可能具有不同的表現形式,我們也可以在子類中重寫一個sleep方法。
class Animal(object): def __init__(self): pass def sleep(self): print("animal is sleeping") class Cat(Animal): def __init__(self): pass def eat(self): print("cat eat fish") def sleep(self):print("cat is sleeping") class Dog(Animal): def __init__(self): pass def eat(self): print("dog eat meet") def sleep(self): print("dog is sleeping") animal = Animal() animal.sleep() cat = Cat() cat.sleep() cat.eat() dog = Dog() dog.sleep() dog.eat()
當父類和子類擁有相同的方法時,執行程式碼,呼叫的總是子類的方法。
這就衍生出“多型”
那怎麼體現多型的好處,下面定義一個函式,接收Animal型別的變數
def sleep_tmp(animal): animal.sleep()
當我們傳入Animal例項,Cat例項,Dog例項時
sleep_tmp(Animal())
sleep_tmp(Cat())
sleep_tmp(Dog())
以上結果可以看出不必對sleep_tmp()做任何修改,實際上,任何依賴Animal作為引數的函式或者方法都可以不加修改地正常執行,原因就在於多型。
多型的好處就是,當我們需要傳入Cat、Dog....時,我們只需要接收Animal型別就可以了,因為Cat,Dog……都是Animal型別,然後,按照Animal型別進行操作即可。由於Animal型別有sleep_tmp()方法,因此,傳入的任意型別,只要是Animal類或者子類,就會自動呼叫實際型別的sleep_tmp()方法,這就是多型的意思。
對於靜態語言(例如Java)來說,如果需要傳入Animal型別,則傳入的物件必須是Animal型別或者它的子類,否則,將無法呼叫sleep()方法。
對於Python這樣的動態語言來說,則不一定需要傳入Animal型別。我們只需要保證傳入的物件有一個sleep()方法就可以了: