python繼承中重載問題:私有函數不能被子類重寫

版本:3.4

在python的繼承中,基類的私有函數不能被子類重寫

例子

下圖是私有函數的重寫:
私有函數

下圖是公有函數的重寫:
公有函數

例子中,base類有兩個函數go,run,其中run裏面調用go,而extend類繼承base類,並重寫go函數;最後創建extend對象調用run函數:
當go函數爲公有函數時,extend對象調用的run中調用的go是重寫後的go函數,也就是extend類自己的go函數
當go函數爲私有函數時,extend對象調用的run中調用的go卻依然是基類的go函數

原因:

在官方文檔中好像沒有提到會出現這個問題,下面是官方文檔裏面關於類繼承的話:

Derived classes may override methods of their base classes. Because methods have no special privileges when calling other methods of the same object, a method of a base class that calls another method defined in the same base class may end up calling a method of a derived class that overrides it. (For C++ programmers: all methods in Python are effectively virtual.)

第一個黑體字部分說,子類可以重寫基類的函數
第二個黑體加斜體的部分,應該是說:一個屬於該基類的函數調用另一個同屬於該基類的函數時,最終可能會調用子類中重寫該函數的函數。
也就是說:函數a屬於類A,函數b屬於類A,函數bb屬於類B,類B繼承類A,其中函數bb重寫了函數b,然後函數a裏面調用函數b,當類B調用函數a時,a裏面最終調用的可能是函數bb

關鍵是它裏面用了may,又可以有兩種解釋,上面的是一種:存在重寫函數,但還是不一定會調用;還有第二種,不知道是否存在重寫函數,有因此用may,換句話說有重寫函數一定用重寫函數。。。

好吧,從裏面我也沒看出原因,不過,我自己認爲的原因是這樣:

在繼承中,子類不能調用基類中的私有成員,因此基類的私有成員實際上對子類是不可見的,所以重寫基類的私有函數的大前提就已經錯了。。。而子類中的與基類一樣的函數,也只是子類中的一個普通函數,因爲算不上重寫,因此在調用時,python的解釋器根本就不採用重寫函數的機制(猜的 ),因此不會調用子類中的函數。

好吧,這是我認爲的,如果有錯,希望大家指出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章