天天看點

【Python基礎入門系列】第10天:Python 類與對象

【Python基礎入門系列】第10天:Python 類與對象

   首先,我已經假定你是個萌新或已經看了無數遍的垃圾文章,然後依然搞不懂類和對象,但是呢起碼知道有類和對象這麼兩個玩意兒,我覺得有必要找一篇生動形象的示例來講解。

由于你可能沒有程式設計經驗,

是以無法從學過的程式設計語言裡通過類比去了解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() #合并豬的各個部位,組裝成最終豬      

這樣來,你确實完成了工作,但有沒有覺得 有點累?

是不是覺得,豬和鴨子有很多相似之處?

如果你學會了,類的用法,可以非常輕松,下面是類的用法

 等等 我先說說

  1. 類、對象在實際程式設計中有啥好處,為啥要用它們
  2. 再給你解釋怎麼去了解它們

   類的好處主要有

  • 友善複用(如果你用函數寫,就要複制整塊代碼,增加了代碼量,增加了出錯率)
  • 友善擴充(函數寫段代碼,若要更新、擴充,都十分複雜,容易出錯,用類來擴充,則友善清晰)
  • 友善維護(因為類是把抽象的東西映射成我們常見的,摸得到的東西,容易了解,維護也友善)

    舉幾個例子了解:

類就像是基因的制造圖紙,我們人類,生的小孩,也是兩隻手,兩隻腳,一個嘴巴,除非變異,否則不會多出一隻腳的,之是以這樣有序的發展,是因為我們身體裡,有基因這張圖紙控制着我們的繁衍

現在我們給上面例子中的制作 鴨子、豬 建立一個通用的制作基因表,利用他們相似制作流程 

建立基因表

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):房子(已經建造好的)

參考: