1. 程式人生 > 其它 >Python學習之繼承和多型

Python學習之繼承和多型

在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()方法就可以了: