在面向對象程序設計中,當咱們定義一個類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()
方法。所以,Dog
、Cat
做爲其子類,自動得到了run()
方法。繼承
嘗試運行下代碼:string
>>> 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()
方法的實現,這種能夠成爲「多態」。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...
點個贊再走吧