一、繼承
- 繼承的概念
在物件導向程式設計中,當我們定義一個類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()
方法。因此,Dog
、Cat
作為其子類,自動獲得了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…
點個贊再走吧