Python 繼承 和 多態


1、繼承

  • 繼承的概念

在面向對象程序設計中,當咱們定義一個類class的時候,能夠從某個現有的class繼承,新的class稱爲子類(Subclass),而被繼承的class稱爲基類、父類或超類(Base class、Super class)。設計

語法形式:code

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
  • 繼承的好處

一、經過父類派生出子類,子類得到了父類的所有功能。子類繼承父類任何屬性,包括數據屬性和方法屬性。
二、除了繼承父類的所有功能,還能夠覆蓋父類的功能,或者定製只屬於本身的特定功能。
如上例子,Animal實現了run()方法。所以,DogCat做爲其子類,自動得到了run()方法。繼承

嘗試運行下代碼:string

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

2、多態

針對上述第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()方法的實現,這種能夠成爲「多態」。class

  • 類與數據類型

當咱們定義 了一個類,實際上也就定義了一種數據類型,與list、dict、string沒有差異。例如:object

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...
點個贊再走吧

相關文章
相關標籤/搜索