2011-07-14 67 views
11

約定是什麼?在Python中,實例變量前面的下劃線是什麼?

class IndexedText(object): 
    def __init__(self, stemmer, text): 
     self._text = text 
     self._stemmer = stemmer 
     self._index = nltk.Index((self._stem(word), i) for (i, word) in enumerate(text)) 
+0

可能的複製名字?](http://stackoverflow.com/questions/1301346/what-is-the-meaning-of-a-single-and-a-double-unde rscore-before-an-object-name) – xli

回答

1

這是一個約定,聲明類/對象的客戶端應儘量避免使用這些屬性,因爲它們是供內部使用的。

12

_表示這些是私人成員。它不以任何方式由語言強制執行,因爲Python程序員都是「consenting adults」。

+0

所以下劃線表示「私有實例變量」,但python不強制它,對吧?這只是一個慣例。 – TIMEX

+1

是的,如果你這樣做(從外部訪問),python不會強制或抱怨。它通常被開發人員用來找出內部使用哪個變量與哪個變量是從外部引用或作爲實例變量 – 2015-07-08 11:51:09

+0

之間的區別。但是,我寧願使用語言來強制執行,因爲它沒有任何意義,否則允許訪問對於沒有真正理由的來自外部的內部變量 – 2015-07-08 11:52:37

2

它暗示僅限內部使用(與其他語言中的私人使用類似),但不像其他語言那樣受到限制。

11

根據PEP 8

此外,使用前導或尾隨 下劃線以下特殊形式被識別(這些一般可以用任何情況下 慣例相結合):

  • _single_leading_underscore:弱的「內部使用」指標。例如。 「來自M import *」不會導入名稱以下劃線開頭的對象。

實際上它並不指在一個類的成員,使用以單下劃線的,但這些往往被用於暗示「內部使用」。對於更強大的版本,使用兩個前導下劃線(例如self.__foo) - Python將會更有力地防止子類意外覆蓋成員,但確定的代碼當然仍然可以。

+0

所以基本上,我不需要使用下劃線。正確? – TIMEX

+0

@TIMEX:不,你不需要使用它。即使你這樣做,沒有人需要尊重它。但這是一個相當常見的慣例,所以使用它也不會帶來任何傷害。 –

+3

@TIMEX:這是「約定」這個詞的定義,是的。它沒有被執行,但它並沒有受到傷害,並且通常有助於遵守它。 – Santa

0

它只是意味着這些屬性僅供內部使用,如果可能的話請勿觸摸它們。

假設您正在編輯一些現有代碼,並且您看到前面帶有下劃線的變量。這意味着你不應該編輯它們。只是一個警告。

所以

self.name = a

self._name =a

self.__name=a

是【什麼是單和雙下劃線的含義的對象之前所有相同

+4

他們實際上並不完全相同,至少不是可以互換的。您需要使用任何名稱(無論是0,1還是2前導下劃線)來訪問該屬性。下劃線用作程序員的通知,但解釋者不執行「僅供內部使用」的建議。 –

相關問題