首先,我已經假定你是個萌新或已經看了無數遍的垃圾文章,然後依然搞不懂類和對象,但是呢起碼知道有類和對象這麼兩個玩意兒,我覺得有必要找一篇生動形象的示例來講解。
由于你可能沒有程式設計經驗,
是以無法從學過的程式設計語言裡通過類比去了解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就是擷取我們傳入的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 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):房子(已經建造好的)
參考: