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