輕松學(xué)會(huì)面向?qū)ο蟮?篇---繼承
任何一門(mén)編程語(yǔ)言,其根本目的都是用抽象的方式來(lái)描述具體的世界,也就是建模。
現(xiàn)實(shí)中的世界,是非常復(fù)雜的,為了應(yīng)對(duì)這種復(fù)雜性,理所應(yīng)當(dāng)?shù)囊肓死^承。
狗是人類(lèi)的好朋友,在一個(gè)游戲里,需要?jiǎng)?chuàng)建很多狗的對(duì)象,也就是需要定義很多狗的類(lèi)。前面的文章里,我定義個(gè)Dog類(lèi),泛指狗,但實(shí)際上狗也分很多種類(lèi),比如獵狗,哈士奇,金毛。。。。。。。
不同種類(lèi)的狗,有不同的技能,不同的用途,如果只定義一個(gè)Dog類(lèi),就如同一個(gè)大雜燴,所有的代碼都要寫(xiě)在一個(gè)類(lèi)里,太臃腫。所以,你應(yīng)當(dāng)想到,對(duì)每一種狗針對(duì)性的創(chuàng)建一個(gè)類(lèi):
HuntDog(獵狗)
HuskyDog(哈士奇)
GoldenDog(金毛)
由于不同種類(lèi)狗之間存在差異性,我們決定定義三個(gè)狗的類(lèi),但是,他們也存在相同之處,比如姓名,年齡,體重,任何一只狗都有這3個(gè)屬性,那么每次定義的時(shí)候,都要把這些屬性的初始化過(guò)程寫(xiě)一遍么?
看到這里,就已經(jīng)接觸到繼承的核心了,繼承這種機(jī)制,并不像引力一樣天然存在的,它純粹是出于管理需要被人為創(chuàng)造出來(lái)的。最簡(jiǎn)單,最直白的理解,繼承可以幫助我們節(jié)省代碼。
class Dog():
def __init__(self, _name, _age):
self.name = _name
self.age = _age
def eat_moon(self):
print("天狗吃月")
class HuntDog(Dog):
pass
class HuskyDog(Dog):
pass
class GoldenDog(Dog):
pass
hunt = HuntDog('閃電', 4)
hunt.eat_moon()
這三個(gè)類(lèi)都繼承了Dog類(lèi),這樣,他們就不必實(shí)現(xiàn)自己的__init__方法,不僅如此,還直接繼承了Dog類(lèi)的eat_moon方法,父類(lèi)有的,子類(lèi)都有。
你可以給獵狗增加狩獵方法,給哈士奇增加拆沙發(fā)方法,給金毛增加陪孩子游戲方法,正如前文所言,不同種類(lèi)的狗有不同的功能,因此我們要分開(kāi)定義,但他們又有相同之處,所以我定義一個(gè)父類(lèi),囊括他們的共性。
這便是用抽象的方式來(lái)描述具體的世界。
