? ?首先,我已經假定你是個萌新或已經看了無數遍的垃圾文章,然后依然搞不懂類和對象,但是呢起碼知道有類和對象這么兩個玩意兒,我覺得有必要找一篇生動形象的示例來講解。
由于你可能沒有編程經驗,
所以無法從學過的編程語言里通過類比去理解Python的‘類和對象’。咱們用生活中的例子來說說:
比如你是玩具廠的工程師,你要制作一個機器,可以批量制作鴨子形狀的玩具,也許你的思路如下:
def makeDuckMoth():#這里可以放其他制作細節 print('鴨子嘴巴制作完畢')
def makeDuckEar(): #這里可以放其他制作細節 print('鴨耳朵制作完畢')
def makeDuckEye(): #這里可以放其他制作細節 print('鴨眼睛制作完畢')
def makeDuckHead(): #這里可以放其他制作細節print('鴨頭制作完畢')
def makeDuckWing():#這里可以放其他制作細節print('鴨翅膀制作完畢')
def makeDuckBody():#這里可以放其他制作細節print('鴨身體制作完畢')
def makeDuckFoot(): #這里可以放其他制作細節print('鴨腳制作完畢')
def makeDuckMerge():#這里可以放其他制作細節
print('鴨子組裝完畢')
makeDuckMoth() #制作鴨嘴巴
makeDuckEar() #制作鴨耳朵
makeDuckEye() #制作鴨眼睛
makeDuckHead() #制作鴨頭
makeDuckWing() #制作鴨翅膀,##注意,豬是沒有翅膀的makeDuckBody() #制作鴨身體makeDuckFoot() #制作鴨腳makeDuckMerge() #合并鴨子的各個部位,組裝成最終鴨子
你發現,自己好厲害,居然學會了整個鴨子的制作流程
?
第二天,老板讓你,制作豬形狀的玩具,難道你的代碼如下:???
def makePigMoth():#這里可以放其他制作細節print('豬嘴巴制作完畢')
def makePigEar():#這里可以放其他制作細節print('豬耳朵制作完畢')
def makePigEye():#這里可以放其他制作細節print('豬眼睛制作完畢')
def makePigHead():#這里可以放其他制作細節print('豬頭制作完畢')
def makePigBody():#這里可以放其他制作細節print('豬身體制作完畢')
def makePigHand():#這里可以放其他制作細節print('豬手制作完畢')
def makePigFoot():#這里可以放其他制作細節 print('4只豬腳制作完畢')
def makePigMerge(): #這里可以放其他制作細節print('豬組裝完畢')
makePigMoth() #制作豬嘴巴
makePigEar() #制作豬耳朵
makePigEye() #制作豬眼睛
makePigHead() #制作豬頭
makePigBody() #制作豬身體
makePigFoot() #制作4只豬腳
makePigMerge() #合并豬的各個部位,組裝成最終豬
這樣來,你確實完成了工作,但有沒有覺得 有點累?
是不是覺得,豬和鴨子有很多相似之處?
如果你學會了,類的用法,可以非常輕松,下面是類的用法
??
?等等?我先說說
?
-
類、對象在實際編程中有啥好處,為啥要用它們
-
再給你解釋怎么去理解它們
?
? ?類的好處主要有
-
方便復用(如果你用函數寫,就要復制整塊代碼,增加了代碼量,增加了出錯率)
-
方便擴展(函數寫段代碼,若要升級、擴展,都十分復雜,容易出錯,用類來擴展,則方便清晰)
-
方便維護(因為類是把抽象的東西映射成我們常見的,摸得到的東西,容易理解,維護也方便)
?
?
? ? 舉幾個例子理解:
類就像是基因的制造圖紙,我們人類,生的小孩,也是兩只手,兩只腳,一個嘴巴,除非變異,否則不會多出一只腳的,之所以這樣有序的發展,是因為我們身體里,有基因這張圖紙控制著我們的繁衍
現在我們給上面例子中的制作 鴨子、豬 建立一個通用的制作基因表,利用他們相似制作流程?
建立基因表
class Animal(object):''' 豬和鴨子的基類(基因圖紙表) '''def __init__(self, name):# 實例化的時候傳入要制作的東西名字,如豬、鴨子 self.name = name def makeMoth(self):#這里可以放其他制作細節print(self.name+'的嘴巴 制作完畢')#這里的self.name就是獲取我們傳入的namedef makeEar(self):#這里可以放其他制作細節print(self.name+'的耳朵 制作完畢')def makeEye(self): #這里可以放其他制作細節 print(self.name+'的眼睛 制作完畢')def makeHead(self): #這里可以放其他制作細節print(self.name+'的頭 制作完畢')def makeBody(self): #這里可以放其他制作細節 print(self.name+'的身體 制作完畢')def makeFoot(self): #這里可以放其他制作細節print(self.name+'的腳 制作完畢')def makeMerge(self): #這里可以放其他制作細節print(self.name+'合并完畢')def makeAll(self): # 一條龍。直接跑完整個流水線self.makeMoth()self.makeEar() self.makeEye()self.makeHead() self.makeBody() self.makeFoot() self.makeMerge()
?
你可以看到,上面的圖紙里,我們沒有放?makeWing() #制作翅膀,那是因為豬不會飛,我們只放豬和鴨子共有的、相同的東西接下來,用這個類,繼承給Pig
代碼如下
class Pig(Animal):# 括號里寫Animal,意思是Pig繼承Animal的所有特性,類似你繼承你老爸的基因def makeMoth(self): #這里加詳細的豬嘴巴制作流程,如長嘴巴,有兩個孔 print(self.name+'的嘴巴 制作完畢')def makeEar(self): #耳朵大大的print(self.name+'的耳朵 制作完畢')def makeEye(self): #眼睛小小的print(self.name+'的眼睛 制作完畢')def makeHead(self): #很大的頭 print(self.name+'的頭 制作完畢')def makeBody(self): #略 print(self.name+'的身體 制作完畢')def makeFoot(self): #略 print(self.name+'的腳 制作完畢')def makeMerge(self): #略 print(self.name+'合并完畢')
?
在class Pig中,如 makeMoth函數方法里面,只加入詳細制作豬嘴巴的代碼,不要把制作豬頭的代碼放這里哦
你發現,class Pig中 沒有了這2段代碼,這是因為,
如果你繼承別的對象,如Animal后,若完全不修改某些方法屬性,就可以不寫出來(實際還是存在Pig中的)
def __init__(self, name): self.name = name
def makeAll(self): # 一條龍。直接跑完整個流水線 self.makeMoth() self.makeEar()self.makeEye()self.makeHead()self.makeBody() self.makeFoot() self.makeMerge()
?
寫出來意味著,你要覆蓋以前代碼塊里的行為,如 :
我們寫出了makeMoth,makeEar ...
意味著我們要把makeMoth里的制作細節改成我們想要的,
豬和鴨子的嘴巴長得不一樣,制作細節肯定不同,對吧?
?
最后我們用以下代碼,讓機器開始造豬
pig1 = Pig('豬') #實例化,相當于懷孕
pig1.makeAll() # 開始造豬,相當于在子宮里形成整體
?
現在開始造鴨子的圖紙,繼承Animal,覆蓋某些代碼
class Duck(Animal): #def makeMoth(self): #這里加詳細的鴨子嘴巴制作流程,如長嘴巴,嘴巴硬print(self.name+'的嘴巴 制作完畢')def makeEar(self): #耳朵很小 print(self.name+'的耳朵 制作完畢')def makeEye(self): #眼睛小小的 print(self.name+'的眼睛 制作完畢')def makeHead(self): #頭很小 print(self.name+'的頭 制作完畢')def makeBody(self): #略 print(self.name+'的身體 制作完畢')def makeFoot(self): #略 print(self.name+'的腳 制作完畢')def makeMerge(self): #略 print(self.name+'合并完畢')def makeWing(self): #增加翅膀的制作流程 #略 print(self.name+'的翅膀 制作完畢')def makeAll(self): #因為增加了翅膀,所以要覆寫這個函數 self.makeMoth() self.makeEar() self.makeEye() self.makeHead() self.makeBody() self.makeFoot() self.makeWing() #插入翅膀制作流程 self.makeMerge()
然后用以下代碼實例化,開始做鴨子
duck1 = Duck('鴨子')duck1.makeAll()
?
?
以后我們要狗、牛、企鵝,都可以從Animal繼承, ?Animal給我們提供了一個框架,我們只需要在這個框架上,擴展,延伸 就可以很方便的做出任何東西,這就是類的魅力
?
?
如果你要做個別的咋辦?
可以建立一個?足夠通用基類,慢慢擴展, 類似人類的老祖宗,最開始是微生物,后來是猴子
?
class Weishengwu(object): '''假設一開始的老祖宗只會吃東西'''
def __init__(self, name):
????????????self.name?=?name?????
???def?eat(self):
???????????print('吃東西')#開始進化成魚類class?Fish(Weishengwu):????'''在老祖宗只會吃的基礎上,學會了移動'''?
???def?move(self):
???????????print('移動')#開始進化成猴子
class?Houzi(Fish):????'''在魚的基礎上學會了爬樹'''??
???def?__init__(self,?name,?love):??#?以前只有名字,現在有了愛好,或許是吃桃子、或許是蕩秋千
?? ????????self.name?=?name?????????
?? ????????self.love?=?love?????
???def?eat(self):????????#覆寫,因為吃東西的方式可能和魚類不一樣了
???????????print('牙齒吃東西')?
???def?move(self):????????#覆寫,不是在水里移動了,是陸地上移動?????
????????????print('腳移動')????
???def?Pashu(self):??????
??? ??print('爬樹')#你可以繼續進化,繼續給他增加任何功
?
總結
希望可以通過這個生動而形象的示例,幫到你懂得 Python 類與對象的定義和使用。最后再給你個生動形象的比喻,希望你能理解。
????類(class): 相當于施工圖紙(blueprint)
????對象(object):房子(已經建造好的)
?
參考:
https://www.runoob.com/python3/python3-namespace-scope.html
https://www.zhihu.com/search?type=content&q=python%E4%B8%8E%E5%AF%B9%E8%B1%A1