HI大家好久不見,上次有人提非常棒的觀點讓CLASS的概念更全面了,我已經把內容修改好了請參閱OOP的第一篇文章,感謝大家給的指教,透過文章交流真的不錯
今天我們就來進入下個內容叫做繼承(Inheritance),繼承是一個非常有趣的概念,適當使用可以降低我們CODING中重複的內容,我們先來看一下沒繼承的CODE會長甚麼樣子。
class NormalPokemon:
attack = 12
defense = 10
health = 15
def __init__(self,name):
self.name = name
self.level = 5
def level_up(self):
self.level += 1
def __str__(self):
return "Pokemon name: {}, Level: {}".format(self.name, self.level)
class GrassPokemon:
attack = 8
defense = 14
health = 13
def __init__(self,name):
self.name = name
self.level = 5
def level_up(self):
self.level += 1
def __str__(self):
return "Pokemon name: {}, Level: {}".format(self.name, self.level)
class FirePokemon:
attack = 17
defense = 7
health = 10
def __init__(self,name):
self.name = name
self.level = 5
def level_up(self):
self.level += 1
def __str__(self):
return "Pokemon name: {}, Level: {}".format(self.name, self.level)
我們生成了三個專門的班級,分別為普通寶可夢(NormalPokemon),草寶可夢(GrassPokemon),火寶可夢(FirePokemon),可以看到不管是甚麼樣的寶可夢,都需要升等(level_up),都需要印自己名片(__str__),這時候我們就來想想一個有關quality的問題。
現實中:
國小 >> 國中 >> 高中 >> 大學 >> 研究所 >> 博士 ,這個升學的過程就可以簡單理解為一個小朋友不斷提升自己的(quality),那麼這之中有甚麼意義呢?
例如我們國小必須學會算數,我們國中才能學方程式,高中才能學矩陣,大學才能學線代工數,研究所才能利用所學基礎科學做研究,因次我們每個能力(ability & quality)都會不斷繼承到下個階段,也就是說每次的畢業到下一階段都是一次繼承,因此我們可以這樣理解:
國小 >> 國中(國小) >> 高中(國中) >> 大學(高中) >> 研究所(大學) >> 博士(研究所)
- PYTHON 繼承會放在CLASS後面的括號中。
python中:
我們可以透過這樣繼承的關係讓我們的不同的屬性的寶可夢繼承一個幼稚園等級的calss,讓我們寶可夢該有的東西都在幼稚園的時候都教會了,剩下比較難的變化題我們讓小朋友畢業到國小再解吧,因此程式就可以改寫成這樣:
class Pokemon:
def __init__(self,name):
self.name = name
self.level = 5
def level_up(self):
self.level += 1
def __str__(self):
return "Pokemon name: {}, Level: {}".format(self.name, self.level)
class NormalPokemon(Pokemon):
attack = 12
defense = 10
health = 15
class GrassPokemon:
attack = 8
defense = 14
health = 13
class FirePokemon:
attack = 17
defense = 7
noel = NormalPokemon('noel')
noel.level_up()
print(noel)
-----------------------------
Pokemon name: noel, Level: 6
透過創立一個幼幼班(Pokemon),我們小朋友都知道怎麼__str__跟怎麼level_up了,到了國小各種不同種類的寶可夢班級時,身為老師十分欣慰都不用重新教了!(不用再各class中重複定義),因此可以讓老師專注在教國小等級的東西,例如每個CLASS自己的CLASS ATTRIBUTE。當然國小老師也可以選擇把幼幼班老師的東西覆蓋掉(重新定義同名method就會蓋掉繼承來的),我的國小英文老師就幫我把幼稚園的東西全都推翻...,拼音發音全部重來,英文重學
結論
繼承可以理解成求學階段,每一個階段的東西都可以再往下繼承
幼幼班定義的東西可以被後面的定義洗掉
沒事多繼承
這篇希望大家都能融會貫通,下篇我們要利用繼承的概念去探討python的幼幼班(object),很常聽到python世界都是object構成的到底是怎麼回事,為什麼我們改變metaclass(type layer)就能夠控制python生成class的規則,下篇我們再來談談這些~
邏輯淺顯易懂,乍看之下也沒啥問題。寫得很棒。