1. 程式人生 > >python基礎17 ---繼承補充知識

python基礎17 ---繼承補充知識

方式 空間 感覺 eight blog span 第一個 引用 --

一、繼承的順序

  1、在python中的類可以集成多個類,既然是繼承多個類就有類的尋找順序這麽一說。其尋找方法就有廣度優先和深度優先兩種。

  2、當類是新式類,多繼承的情況下會按照廣度優先的順序查找。

  如圖:

  技術分享

    當H這個類是新式類也就是說它的父類中有object這個類,那麽他要查找某個屬性,會先從自己的類中查找,如果沒有再查找父類的,查找順序為:H->E->B->F->C->G->D->A。註意父類A是最後查找的,所以說他是廣度優先。

    當H這個類是經典類也就是說它的父類中沒有object這個類,那麽他要查找某個屬性,會先從自己的類中查找,如果沒有再查找父類的,其查找順序為:H->E->B->A->F->C->G->D。註意父類D是最後查找的,所以說他是深度優先。

    以上兩種查找屬性的情況是建立在他們的父類的父類是同一個類的前提下,如果沒有同一個類這麽一說那麽他們的查找順序都是廣度優先。如果是新

式類的情況下可以用類名.mro()的方式查看繼承的順序。二、子類中調用父類的方法圖1

技術分享

如圖1:以前子類調用父類的屬性時是指名道姓的查找父類的屬性,這樣就麽有了繼承的順序這麽一說了。

技術分享

如圖二、現在調用父類方法直接是用一個super()對象來直接調用父類的__init__方法,對象和函數屬性之間是綁定方法的關系,

    默認會自動傳參,因此不用寫self本身。這樣就遵循了繼承的順序查找的方法。 註意:在python2中也有super()方法,

  但是格式為:super(類名,self)

二、封裝

  1、為什麽要封裝?

    封裝不是單純意義上的隱藏,封裝數據的主要原因是為了保護數據,封裝方法的主要原因是為了隔離復雜度。

  2、封裝分為兩個層面

    2.1第一個層面的分裝(什麽都不用做):創建類和對象會分別創建他們的名稱空間,我們只能用類或者對象.的方式去訪問裏

   面的數據屬性或者是函數屬性,這本身就是一種封裝。

    2.2第二個層面的封裝:就是把類裏面的某些屬性和方法隱藏起來,或者說是定義成私有的只能在內部使用,外部無法使用,或者

   說是留下少量接口供外部訪問。在python3中用雙下劃線就可以實現封裝。

    2.3封裝其實分為兩個層面,但無論哪種層面的封裝,都要對外界提供好訪問你內部隱藏內容的接口(接口可以理解為入口,有了

   這個入口,使用者不能夠直接訪問到內部隱藏的細節,只能走接口,並且我們可以在接口的實現上附加更多的處理邏輯,從而嚴格控

  制使用者的訪問)

  3、如圖: 圖一                        圖二

技術分享技術分享

    3.1類的封裝式在類的定義階段就已經封裝好了的,所以可以在類的內部使用,但是如果在類的外部實例化產生對象後再對類的

  內部做分裝操作會失敗。

    3.2封裝後的類在外部無法直接使用類內部的屬性,使用格式為:對象._封裝後的屬性的類__封裝後的屬性。

    3.3在子類定義的__x不會覆蓋在父類定義的__x,因為子類中變形成了:_子類名__x,而父類中變形成了:_父類名__x,即雙下滑線開頭的屬性在繼承給子類

  時,子類是無法覆蓋的。如下圖所示:

property特性

  1、如圖1                        圖2

技術分享技術分享

  如圖1默認情況下想要知道egon的名字需要用對象調用tell_name這個函數,即(egon.tell_name()),在現實生活中name是個名詞調用它不應該用加()的方式執行,給用戶的感覺就好像是調用了個函數,所以引用了property這個可調用對象,把函數屬性變為數據屬性,如圖二就可以調用該屬性了,為了更能符合用戶需求,return 這個打印的值。

  2、如圖

  技術分享

  2.1當函數被property裝飾後,返回的結果相當於一個數據數學,可直接調用該函數名就能實現其功能,裝飾後的函數還自動附帶了

  增刪改的屬性,調用它就可以使用了

    

  

  

  

 

python基礎17 ---繼承補充知識