2012-08-02 61 views
1

我要遵循良好的編程習慣,所以我有點停留在這個問題:訪問來自繼承類的私有方法在python

可以說我有類根,

Class root(Object): 
    def __init__(self): 
    self._root_tree = 'Base' 

    def __str__(self): 
    return self._root_tree 

    def _test(self): 
     return 'test' 

可以說,我創建一個名爲橡樹

Class Oak(root): 
    def __str__(self): 
     return 'Oak' 
    def _test(self): 
     return 'Oak_test' 
    def _new_fun(self): 
     return 'new_func_only_in_oak' 

然後在此類櫻桃類,我可以做以下

Class Cherry(root): 
    def _grab_trees(self,another_tree): #another_tree is a Oak object 
     other_tree = another_tree.__str__() #this will return Oak 
     return 'The other three is: ' + other_tree 
    def _test2(self,another_tree): 
     return another_tree._test() 
    def _testing_new(self,another_tree): 
     return another_tree._new_fun() 

基本上在Cherry類中調用__str__()_new_fun()_test()有效(良好做法)。

+3

那麼...又是什麼問題? – 2012-08-02 02:17:01

+0

'Cherry'類方法不訪問它們自己實例的超類的私有方法,它們正在訪問那些通過額外參數(即非自身屬性)傳遞給它們的實例的方法。這打破封裝。 – martineau 2012-08-02 03:13:06

回答

0

你可以,但在這個例子中,最好只打str(another_tree)。一般來說,除非你正在做一些與它們的實現特別相關的事情(例如,在子類實現中調用一個超類實現),否則不應該直接調用雙下劃線方法。大多數情況下,雙下劃線方法的存在是爲了讓該類在更「正常」的上下文中以某種方式運行,並且您應該將正常上下文用於正常目的。例如,__str__的存在是爲了讓班級在您撥打str()時做正確的事情,所以您應該撥打str(),而不是直接撥打__str__

至於單下劃線方法,除非您編寫它們,否則調用這些方法通常不是個好主意。這樣做沒有「懲罰」,但按照慣例,單下劃線表示不屬於公共API的方法。因此,如果您使用它們,那麼如果您正在使用的庫已更新,並且這些下劃線方法消失或更改,則可能會導致代碼中斷。

+0

關於調用特殊方法的好處,但是如何調用另一個實例的私有方法,那些以單個下劃線開始的方法呢? – martineau 2012-08-02 03:09:43

0

這取決於您的設計聲明爲這些類的方法的邏輯接口。

如果你以某種方式指定你要返回非實例,那麼你所做的是非常好的。如果您創建隱式期望,該方法返回Cherry的實例,並且您返回Oak,那麼您將爲嚴重錯誤引入空間。

一般來說,保留__method__約定爲您的班級的內部工作和重鑄。