2014-04-18 78 views
4

據我所知,寫Python模塊私有/保護功能,使用如何在python中編寫模塊私有/受保護的方法?

def _func(): 
    ... 

,但我有專門的覆蓋對象層次。此外,我想隱藏內部實現(因爲它不適合外部使用,所以我希望在不破壞代碼的情況下改進它,並不是我認爲除了我之外任何人都會使用它)。如果我使用

class Paragraph(Tag): 
    def _method(self): 
     ... 

,並嘗試從不同類的子類標籤的IntelliJ IDEA(可能pylint的/其他跳棋也)給我一個警告,叫_method。有沒有什麼辦法解決這一問題?

我的用例是一組markdown標記對象,用於生成可以轉換爲正確的markdown字符串的「Tree」狀結構。每個標記都會覆蓋受保護的方法以轉換其自身以及其包含的標記,並且某些方法會覆蓋檢查子標記是否有效的方法(例如,沒有嵌套的粗體)。只有頂級標記上下文才有公共方法來轉換樹。

編輯:

IntelliJ IDEA的警告:

訪問類的保護成員_method

+0

「冒犯」電話是什麼樣的? –

+2

爲什麼不直接忽略Intellij警告?對於這樣的電話,Pylint不會對此產生任何影響,順便說一句。這只是一個慣例,而你正是按照慣例正確使用慣例。 –

+0

可能的重複:http://stackoverflow.com/questions/1301346/the-meaning-of-a-single-and-a-double-underscore-before-an-object-name-in-python – lorenzog

回答

4

澄清:

  • 如果名稱與一個下劃線開始,它是「保護」。
  • 如果一個名字以兩個下劃線開始,但不以兩個下劃線結尾,則它是'私人'。

'受保護'僅僅是一種約定,但語法檢查器對於在類層次結構之外訪問它們並不在行。

'私人'是通過名稱修飾實現的,以便該元素只能在定義它的類中使用。兩個下劃線被替換爲_<name of class>__。有技巧來規避這種...

這就是說,你得到了什麼警告?在下面的例子中,pylint並沒有警告我在Test類中使用_func,但是我在最後一行得到警告(W0212)。你忘了在基類中定義受保護的函數嗎?

class Test(object): 
    ''' . ''' 
    def _func(self): 
    ''' . ''' 
    raise NotImplementedError() 
    def fun(self): 
    ''' . ''' 
    self._func() 

class Demo(Test): 
    ''' . ''' 
    def _func(self): 
    ''' . ''' 
    print 'Hi' 

t = Demo() 
t._func() 
+0

問題是python中缺少類型提示,它可能不能說明它們是層次結構的一部分。 –