2014-10-11 72 views
1

假設我有一個對調用者無用的方法(即它應該是私有的)的一個python類,但它有一些角落案例,所以我想對它做一個完整性檢查(即它應該被單元測試)。Doctest python中的私有方法

天真,我希望我可以寫一個文檔測試:

class Thingy: 
    ... 

    def __frob(self, val): 
     """ 
     >>> Thingy(...).__frob(-2) 
     1 
     """ 
     ... 

但是,當我這樣做,我得到一個錯誤:

AttributeError: type object 'Thingy' has no attribute '__frob' 

這使得在事後的意義,但不是很方便。

是否有一種簡單的方法來測試私有方法,除了只是公開它們?

回答

4

Python確實沒有私有方法。雙下劃線名稱是mangled;他們會得到名稱前綴(帶有前導下劃線)的類名稱。這是因爲他們的目標是幫助避免名稱衝突,而不是外部呼叫者的私人。子類現在可以安全地定義它們自己的Thingy.__frob(),它將與父類保持分離。

因此,您可以手動應用相同的變換測試:

Thingy(...)._Thingy__frob(-2) 

例如將_ClassName添加到方法名稱的開頭。

只是要明確;該功能主要是爲了避免子類使用的屬性之間的名稱衝突。它也恰好適用於方法名稱,因爲方法本質上也是屬性。

+0

噢,這種損壞發生在一個一致的方式,它是指猶太人的名字?有用。 – 2014-10-11 16:02:11

+0

@Strilanc:是的,這是一個很好的定義,也是語言規範的一部分。 – 2014-10-11 16:04:48