面向?qū)ο笾^承和多態(tài)
繼承 子類繼承父類所有功能
class Animal(object):
def run(self):
print('animal is running...')
# 創(chuàng)建Animal實例
animal = Animal()
animal.run()
# Dog類
class Dog(Animal):
pass
# 創(chuàng)建Dog 實例
dog = Dog()
# 調(diào)用Dog類繼承來自于Animal類的run方法
dog.run()
現(xiàn)在我有這樣一個需求 就是 不同子類繼承父類調(diào)用run()锨天,輸出不同的信息辣垒,那么我們就需要在子類里邊重新定義該方法來覆蓋父類中的方法,這叫做多態(tài)
# Cat類 繼承 Animal
class Cat(Animal):
def run(self):
print('cat is running...')
cat = Cat()
cat.run()
class Monkey(Animal):
def run(self):
print('Monkey is running...')
monkey = Monkey()
monkey.run()
# 現(xiàn)在輸出了不同信息,但是每次都要寫這么多,感覺多態(tài)也挺麻煩的分冈,那我們再優(yōu)化下:
print('-------------------------------------')
def _run(animal):
animal.run()
animal.run()
_run(Dog())
_run(Cat())
_run(Monkey())
# 這樣就體現(xiàn)出多態(tài)的好處了
# 我們也可以還派生出一些類來, 比如:
class Tortoise(Animal):
def run(self):
print('Tortoise is running slowly...')
_run(Tortoise())
靜態(tài)語言Java和動態(tài)語言Python的區(qū)別:
對于靜態(tài)語言(例如Java)來說霸株,如果需要傳入Animal類型雕沉,則傳入的對象必須是Animal類型或者它的子類,否則去件,將無法調(diào)用run()方法
對于Python這樣的動態(tài)語言來說坡椒,則不一定需要傳入Animal類型。我們只需要保證傳入的對象有一個run()方法就可以了:
這就是動態(tài)語言的“鴨子類型”尤溜,它并不要求嚴(yán)格的繼承體系倔叼,一個對象只要“看起來像鴨子,走起路來像鴨子”宫莱,那它就可以被看做是鴨子丈攒。 證明:
print('--------------------------------------')
class Rabbit(object):
def run(self):
print('Rabbit is running...')
_run(Rabbit()) # Rabbit is running...
小結(jié)
繼承可以把父類的所有功能都直接拿過來,這樣就不必重零做起,子類只需要新增自己特有的方法巡验,也可以把父類不適合的方法覆蓋重寫识椰。
動態(tài)語言的鴨子類型特點決定了繼承不像靜態(tài)語言那樣是必須的。
關(guān)注一波深碱!喜歡一波!本人是前端菜鳥藏畅,正在做自己的個人博客鄧鵬的博客敷硅,歡迎來交流學(xué)習(xí), 使用的技術(shù) vue + koa2 + mysql + php + nginx愉阎!