在OOP程序設計中朦乏,當我們定義一個class的時候球及,可以從某個現有的class繼承,新的class稱為子類(Subclass)呻疹,而被繼承的class稱為基類吃引、父類或超類(Base class、Super class)。
繼承
# 父類
class Animal(object):
def run(self):
print('Animal is running...')
# 子類
class Dog(Animal):
pass
class Cat(Animal):
pass
對于Dog來說镊尺,Animal就是它的父類朦佩,對于Animal來說,Dog就是它的子類庐氮。Cat和Dog類似吕粗。
# 繼承有什么好處?最大的好處是子類獲得了父類的全部功能旭愧。
dog = Dog()
dog.run()
cat = Cat()
cat.run()
# 運行結果
Animal is running...
Animal is running...
# 當然颅筋,也可以對子類增加一些方法,比如Dog類:
class Dog(Animal):
def run(self):
print('Dog is running...')
def eat(self):
print('Eating meat...')
多態(tài)
# 繼承的另一個好處输枯,多態(tài)议泵。
class Dog(Animal):
def run(self):
print('Dog is running...')
class Cat(Animal):
def run(self):
print('Cat is running...')
# 運行結果
Dog is running...
Cat is running...
當子類和父類都存在相同的run()
方法時,我們說桃熄,子類的run()
覆蓋了父類的run()
先口,在代碼運行的時候,總是會調用子類的run()
瞳收。這樣碉京,我們就獲得了繼承的另一個好處:多態(tài)。
# 多態(tài)的好處
class Tortoise(Animal):
def run(self):
print('Tortoise is running slowly...')
>>> run_twice(Tortoise())
Tortoise is running slowly...
Tortoise is running slowly...
你會發(fā)現螟深,新增一個Animal的子類谐宙,不必對run_twice()做任何修改,實際上界弧,任何依賴Animal作為參數的函數或者方法都可以不加修改地正常運行凡蜻,原因就在于多態(tài)。
多態(tài)的好處就是垢箕,當我們需要傳入Dog
划栓、Cat
、Tortoise
……時条获,我們只需要接收Animal類型就可以了忠荞,因為Dog
、Cat
帅掘、Tortoise
……都是Animal
類型委煤,然后,按照Animal類型進行操作即可锄开。由于Animal
類型有run()
方法素标,因此称诗,傳入的任意類型萍悴,只要是Animal類或者子類,就會自動調用實際類型的run()
方法,這就是多態(tài)的意思:
對于一個變量癣诱,我們只需要知道它是Animal
類型计维,無需確切地知道它的子類型,就可以放心地調用run()
方法撕予,而具體調用的run()
方法是作用在Animal
鲫惶、Dog
、Cat
還是Tortoise
對象上实抡,由運行時該對象的確切類型決定欠母,這就是多態(tài)真正的威力:調用方只管調用,不管細節(jié)吆寨,而當我們新增一種Animal的子類時赏淌,只要確保run()
方法編寫正確,不用管原來的代碼是如何調用的啄清。這就是著名的“開閉”原則:
對擴展開放:允許新增Animal
子類六水;
對修改封閉:不需要修改依賴Animal
類型的run_twice()
等函數。