2009-10-27 116 views
2

我一直在寫Python代碼只有幾個星期,所以我仍然在計算出這片土地。但是讓我們假設我有一個方法可以被一個'用戶'偶爾以及內部使用的HEAVILY調用(即參數在調用之前已經被檢查過)。這是我目前正在做的:Python:公共方法調用他們的'兄弟'私有方法

#The method the 'user' should call: 
def do_something(self, arg1, arg2, arg3): 
    #write code to do error checking on arg1, agr2, arg3 
    #raise exceptions, return codes, etc: depends on whether you are an explicit lover 
    #or an implicit lover, it seems. :-) 
    ... error checking code here... 
    #Now call the 'brother' method that does the real work. 
    return self._do_something(self, arg1, arg2, arg3, arg3) 

#The method other private methods should call with already validated parameters 
def _do_something(self, arg1, arg2, arg3, arg3): 
    #don't do error checking on the parameters. get to work... 
    ... do what you do... 
    return whatever you're supposed to return 

這對我來說似乎是合乎邏輯的。有沒有更好的Python-ISH方式來做到這一點?

保羅

回答

2

這很好。不過,在你的代碼中調用「兄弟」方法是錯誤的。你應該做的是這樣的:

# Now call the 'brother' method that does the real work. 
return self._do_something(arg1, arg2, arg3, arg3) 

也就是說,你應該把它叫做「穿越」自我參照,因爲它是一個對象的方法,而不是一個全局函數。

+0

是的,謝謝你。 – TallPaul 2009-10-27 17:03:33

+0

按建議編輯方法調用。 – TallPaul 2009-10-27 17:14:37

0

沒有爲在python的私有成員沒有「真正」的支持,但Python的方式來指示成員爲私有是使用兩個前導下劃線。在你的情況下,__do_something

有關進一步詳情,請參閱python.org - classes

+0

真正的專用字段可以通過將函數添加到其自己的__init__中引用局部變量的閉包來創建。雖然很多人似乎都不知道這一點。 – recursive 2009-10-27 16:11:58

+1

-1:實際中很少使用兩個下劃線,通常的pythonic方式是單個下劃線。 – nikow 2009-10-27 16:32:39

+0

@nikow,你在這裏只是錯了。兩個下劃線是Python中「私有」的方式,它甚至支持語言(名稱從__foo到_ClassName__foo)。你可能會想到Python的*約定*(只有這個),「受保護的」成員只使用一個下劃線。 – 2009-12-16 17:12:28

-1

我剛開始學習Python的自己(和享受它),但我認爲這是應該做的方式。 但是,私有方法應該有兩個下劃線,並稱爲'self .__ do_something()'。

0

好吧,除非錯誤檢查代碼非常昂貴,否則我將只有一個方法,它總是進行錯誤檢查。它可能會重複一些檢查,但它確實爲您提供了更多的安全性,如果有人從您的班級繼承,它可能會派上用場。

如果稍後需要性能,您可以隨時緩存結果或執行其他操作。

+0

就我而言,我正在重寫biopython模塊。有一種方法可以根據四字符代碼從FTP下載文件。用戶可以單獨調用一個文件進行下載,也可以根據索引文件中編寫的代碼要求批量下載57000多個文件。如果用戶調用它,我需要檢查它們傳入的代碼。如果代碼來自具有57000代碼的索引文件,則不需要檢查以確保它們具有有效格式! – TallPaul 2009-10-27 17:11:22

+0

在這種情況下,我想這是有道理的分開兩種方法。儘管我會使用不同的名稱,但要明確一種方法是與用戶輸入一起使用的,而另一種則不是。 – 2009-10-27 17:16:15