Python 繼承 和 多型

unpredictable_X發表於2019-02-16

一、繼承

  • 繼承的概念

在物件導向程式設計中,當我們定義一個類class的時候,可以從某個現有的class繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)。

語法形式:

class new_class_name( base_class_1,base_class_2,…. ):
    pass

例如:

class Animal(object):
     def run(self):
         print(`animal is running ...`)

# Dog繼承Animal,子類獲得了父類的全部功能
class Dog (Animal):
     pass
class Cat(Animal):
     pass
  • 繼承的好處

1、通過父類派生出子類,子類獲得了父類的全部功能。子類繼承父類任何屬性,包括資料屬性和方法屬性。
2、除了繼承父類的全部功能,還可以覆蓋父類的功能,或者定製只屬於自己的特定功能。
如上例子,Animal實現了run()方法。因此,DogCat作為其子類,自動獲得了run()方法。

嘗試執行下程式碼:

>>> dog = Dog()
>>> dog.run()
animal is running ...
>>> cat = Cat()
>>> cat.run()
animal is running ...

二、多型

針對上述第2點,通過繼承覆蓋,可以給子類單獨增加或者修改一些方法。

class Animal(object):
     def run(self):
         print(`animal is running ...`)

# Dog繼承Animal,子類獲得了父類的全部功能
class Dog (Animal):
    # 多型,子類的方法覆蓋了父類的方法
     def run(self):
         print(`dog is running...`)     
     def eat(self):
         print(`eating meat`)
    
class Cat(Animal):
     def run(self):
         print(`cat is running ... `)

在子類中,分別重新修改了run()方法的實現,這種可以成為“多型”。

  • 類與資料型別

當我們定義 了一個類,實際上也就定義了一種資料型別,與list、dict、string沒有差別。例如:

a = list()    # a是list型別 
b = Animal() # b是Animal型別 
c = Dog()   # c是Dog型別

我們可以通過isinstance()來判斷他們的型別:

>>> isinstance(a, list) 
True 
>>> isinstance(b, Animal) 
True 
>>> isinstance(c, Animal) 
True                        # 此處c不僅僅是Dog型別,還是Animal型別。
>>> isinstance(b, Dog) 
False

可以發現,c物件不僅僅是Dog型別,還是Animal型別(Dog的父類)。但是反過來,Animal不是Dog型別。
即在繼承關係中,如果一個例項的資料型別是某個子類,那它的資料型別也可以被看做是父類。但是,如果一個例項的資料型別是父類,不可以被看做是子類。

嘗試如下執行:

dog = Dog()
dog.run()
cat = Cat()
cat.run()
結果就是:
dog is running...
cat is running...

在上述中,傳入dog和cat都是Animal型別,由於Animal型別有run()方法,因此,只要傳入的型別是Animal類或者子類,就會自動呼叫實際型別的run()方法,無需確切地知道它的子型別。但是具體呼叫的run()方法是作用在哪個物件上(具體呼叫哪個類的run()方法),由執行時該物件的確切型別決定。
Dog類對run()方法進行了重寫,則dog物件呼叫的是自身類裡的run()方法,同理cat物件。


❤ thanks for watching, keep on updating…
點個贊再走吧

相關文章