真正的大餐來以前,仍是來點兒開胃菜!回顧一下關於類的繼承的知識:小程序
咱們先看上面的代碼,這是一個簡單的類繼承,咱們能夠看到父類Base和子類Son,它們中各有一個Testfunc方法,當咱們實例化子類的對象sonobj時,能夠看到初始化方法中黃色框框調用了Testfunc,那麼這個時候執行的是哪一個類裏面的代碼呢?我會告訴你執行的是子類裏面的方法,不信就本身試試吧,代碼在下面~post
爲何呢?其實這裏是繞了一個圈,因此把不少人繞暈了,包括我!後來想一想其實很容易,咱們看最右邊的圖:spa
若是這樣看,咱們是否是就明白了?其實這兩段代碼表示的是一個意思,儘管Son繼承了Base類,父子類中都有一樣的方法,可是因爲咱們實例化了子類的對象,因此這個在初始化方法裏的self.Testfunc,self指的是子類的對象,固然也就先調用子類中的方法啦。因此儘管在第一個例子中,初始化方法在父類執行,可是仍是改變不了它是子類對象的本質,當咱們使用self去調用Testfunc方法時,始終是先調用子類的方法。咱們能夠這樣理解,儘管兒子繼承了父親的財產,可是花錢的時候,仍是要先花本身的~~~3d
看完剛剛的代碼,咱們就知道了對象和self的真實意義,如今再來回憶一下關於繼承的順序問題: code
看上面的代碼,咱們猜想一下,執行以後,控制檯會打印什麼呢?先揭曉答案,會打印Base2方法中的內容,緣由很簡單:儘管這三個類中都有一樣的Testfunc方法,可是,因爲計算機在找方法的時候,遵循的順序是:Base2,Son,Base,因此它會先找到Base2類,而這個類中恰好有它要找的方法,它也就歡歡喜喜的拿去執行啦!對象
畫個簡易類圖blog
剛剛咱們只是寫了一個小程序,來講明類之間的繼承和對象調用方法之間的聯繫,可是若是咱們想要hold住一個繼承關係複雜的源碼邏輯,就須要類圖來幫忙!若是你以爲我要教你畫類圖那就大錯特錯了。。。懶人症重症患者是懶得畫那種東西的。。。嘻,先看圖!繼承
對照類圖看源碼源碼
根據上面的圖,咱們就拿到了threadingTCPServer的相關類,而且搞清楚了它們之間的繼承關係和方法,接下來咱們對照這張簡易類圖來看看代碼執行的過程:it
初始化相關過程:
執行serve_forever的相關代碼:
就是這樣,咱們一路按照調用軌跡去尋找,每次看到一個調用都先對照上面的簡易類圖,看看有沒有重名方法,若是有,就要找到最近的方法並查看裏面的內容,以此類推:按照這種方法,就會感受全部代碼都在一個文件同樣,媽媽不再用擔憂我看不懂源碼,哈!!!固然啦,這種方法比較山寨,本身內心知道就好,不要告訴別人你實際上是這樣看懂源碼的~~~