2011-09-30 29 views
7

我看到代碼中的函數/常量前綴爲下劃線。 我的理解是,這表明他們不能直接使用。 我可以用類來做到這一點嗎?這是一個約定前綴私人類與下劃線?

class _Foo(object): 
    pass 

class __Bar(object): 
    pass 
+3

'__'由Python保留。永遠不要使用這個。這在大多數情況下會導致名稱混亂的問題。儘量避免認爲這是有用的。試着將其看作是「保留」和「不是一般用途」和「等待發生的問題」。然後,請把它從你的問題中拿出來。 –

+0

請解釋一下「私人」課程可能是什麼。你能提供一個用例或者你會使用它的情況嗎? –

+0

將會出現用戶應該使用的導出函數。在這些函數中,它將實例化這些「私有」類。 – canadadry

回答

6

最好只使用一個_。這表明名稱在模塊內是私有的。

它不是全部引入from <module> import *,它還有一些其他功能,如「首選銷燬」。

here

如果__all__沒有定義,一組公開的名字包括模塊的名稱空間中的所有名稱 不以下劃線 字符開頭(「_」)。

here

與1.5版本開始,Python的保證全局名字始於 單下劃線從該模塊中被刪除其他全局被刪除之前。

雙下劃線起始類成員是name-mangled

5

是; PEP8認可單用於下劃線的內部使用類。

我不認爲雙重下劃線的使用在大多數情況下都會有實際的效果,因爲它用於爲類屬性主動命名修飾,並且通常一個類不是另一個類的屬性(授予它, 可以是,在這種情況下Python會愉快地裂傷你的名字。)

2

您可以使用一個下劃線作爲任何變量的第一個字符,但它承載的寓意,「不使用外班級/模塊,除非你真的知道自己在做什麼「(例如,預期的受保護/內部),並且如果使用from <module> import *則不會導入。

使用雙下劃線是你永遠不應該在班級以外做的事情,因爲它可能會混淆名稱否則(和「可以」,我的意思是「過去一週讓我很頭痛,因爲我沒有意識到它確實「)。

2

是的,這不僅是一個約定。當您從該模塊登錄import *時,不會導入以下劃線開頭的名稱。

+1

查看glglgl的答案 - 只有在沒有定義'__all__'的情況下。如果需要,你可以在你的'__all__'中包含下劃線前綴名。 – agf

相關問題