介紹
介紹
之前我們跟著福哥完成了“做個搜尋引擎”專案的前半部分“網頁蜘蛛”的程式的編寫,童鞋們可以看到福哥將網頁蜘蛛的功能封裝成為了一個Spider物件,而不是簡簡單單的寫一些函式,更不是直接碼程式碼堆邏輯。大家可以發現在網頁蜘蛛的“主程式”裡面的程式碼非常簡單,很清爽,很乾淨,這就是物件程式設計的優勢,我們可以將功能的實現和業務的設計分離開來,在功能程式碼裡只關注功能實現,在業務設計程式碼裡只考慮業務設計,這是物件程式設計的思維帶來的好處,程式設計師需要培養自己這個思維。
今天我們來學習一下Python語言裡面的有個物件程式設計的一些高階語法,這些內容包括建構函式、解構函式、物件繼承、方法過載,掌握這些技巧可以幫助我們設計出更加優美的物件,編寫出更加漂亮的程式碼。
建構函式(Construct)建構函式就是一個物件在初始化的時候自動被呼叫的一個函式,我們可以在這個函數里進行物件屬性初始化的操作,也可以透過這個函式傳遞預設引數給我們的物件
python的建構函式使用了特殊的函式名稱,即:__init__,使用這個名稱定義的物件方法就會被作為物件建構函式使用
示例
可以看到,我們透過建構函式傳遞了id和name到物件TFMember裡,並且將它們賦值給物件屬性mId和mName
class TFMember: mId = None mName = None def __init__(self, id, name): self.mId = id self.mName = name def dump(self): print ("(" + str(self.mId) + ") " + self.mName)fuge = TFMember(168, "福哥")fuge.dump()
解構函式(Destruct)解構函式就是一個在物件不再使用的時候(被釋放資源之前)自動呼叫的一個函式,我們可以在這個函數里面關閉一些需要手動釋放資源的控制代碼,例如:pymysql、elasticsearch等等
python的解構函式使用了特殊的函式名稱,即:__del__,使用這個名稱定義的物件方法就會被作為物件解構函式使用
示例
我們建立了解構函式,在裡面列印了一句話,執行程式後,看到這句話的時候證明物件例項fuge就要被釋放資源了
class TFMember: mId = None mName = None def __init__(self, id, name): self.mId = id self.mName = name def dump(self): print ("(" + str(self.mId) + ") " + self.mName) def __del__(self): print ("object TFMember for " + str(self.mId) + " is destroy")fuge = TFMember(168, "福哥")fuge.dump()
物件繼承(Extends)物件繼承和我們理解的人類的繼承很相似,兒子繼承了父親的DNA,那麼兒子會從長相、性格、膚色、智力等等很多方面接近他的父親,而子物件繼承了父物件,那麼子物件會擁有父物件的全部屬性和方法
示例
我們建立了TFManager物件,這個物件繼承了TFMember物件,所以TFManager的例項fuge也會擁有dump方法,也會擁有mId和mName屬性
class TFMember: mId = None mName = None def __init__(self, id, name): self.mId = id self.mName = name def dump(self): print ("(" + str(self.mId) + ") " + self.mName) def __del__(self): print ("object TFMember for " + str(self.mId) + " is destroy")class TFManager(TFMember): mRank = 0 def __init__(self, id, name, rank): self.mId = id self.mName = name self.mRank = rank def __del__(self): print ("object TFManager for " + str(self.mId) + " is destroy")fuge = TFManager(168, "福哥", 8)fuge.dump()
大家可以看到雖然我們在TFMember和TFManager兩個物件裡都設定了建構函式和解構函式,但是最後生效的只是TFManager這個物件的建構函式和解構函式
方法過載(Override)方法過載的意思就是基於物件繼承之上的,比方說:一對父子都去做一道西紅柿炒雞蛋,兩人都比較喜歡甜口味,但是兒子可能還會放一點鹽,這點和父親不一樣。也就是說,兒子的某些能力或者行為與父親不會完全一樣,這時候定義兒子的時候就需要重新定義這種能力或者行為,這種做法在物件程式設計裡叫做方法過載
python的物件方法的過載很自由,只要子物件的方法名稱和父物件一樣,無所謂函式是否一樣都沒關係,這樣子物件的這個方法就會覆蓋父物件的同名方法了
示例1
可以看到我們在TFManager裡也定義了dump這個方法,且改變了方法的引數和實現,在fuge這個例項下執行後會發現實現完全是TFManager的邏輯了
class TFMember: mId = None mName = None def __init__(self, id, name): self.mId = id self.mName = name def dump(self): print ("(" + str(self.mId) + ") " + self.mName) def __del__(self): print ("object TFMember for " + str(self.mId) + " is destroy")class TFManager(TFMember): mRank = 0 def __init__(self, id, name, rank): self.mId = id self.mName = name self.mRank = rank def dump(self, type): if type == 1: print ("{" + str(self.mId) + "} " + self.mName) elif type == 2: print ("[" + str(self.mId) + "] " + self.mName) else: print ("(" + str(self.mId) + ") " + self.mName) def __del__(self): print ("object TFManager for " + str(self.mId) + " is destroy")fuge = TFManager(168, "福哥", 8)fuge.dump(1)fuge.dump(2)fuge.dump(3)
示例2
現在我們把TFManager的建構函式和解構函式都去掉了,會發現解構函式又變成了TFMember的實現邏輯了,這說明了在子物件裡定義建構函式和解構函式也會過載父物件的建構函式和解構函式
class TFMember: mId = None mName = None def __init__(self, id, name): self.mId = id self.mName = name def dump(self): print ("(" + str(self.mId) + ") " + self.mName) def __del__(self): print ("object TFMember for " + str(self.mId) + " is destroy")class TFManager(TFMember): mRank = 0 def dump(self, type): if type == 1: print ("{" + str(self.mId) + "} " + self.mName) elif type == 2: print ("[" + str(self.mId) + "] " + self.mName) else: print ("(" + str(self.mId) + ") " + self.mName)fuge = TFManager(168, "福哥")fuge.dump(1)fuge.dump(2)fuge.dump(3)
總結好了,今天童鞋們跟著福哥學習了python語言的物件程式設計基礎知識:建構函式、解構函式、物件繼承、方法過載。掌握了這些技巧之後,大家就可以設計出更為複雜,更為龐大的系統了。物件程式設計水平的提高是一個漫長的過程,需要在不斷的專案開發過程中積累經驗,需要在不斷是實踐當中總結教訓,才能一步一步地成為大師的。
https://m.tongfu.net/home/35/blog/512821.html