Python中的下劃線

單下劃線(_)

一般狀況下,會在如下3種場景中使用:django

一、在解釋器中函數

在這種狀況下,「_」表明交互式解釋器會話中上一條執行的語句的結果。spa

>>> _
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name '_' is not defined
>>> 88
>>> _
88

二、做爲一個名稱翻譯

「_」做爲臨時性的名稱使用。當其餘人閱讀你的代碼時將會知道,你分配了一個臨時用的名稱。以下,你可能對循環計數中的實際值並不感興趣,此時就可使用「_」。code

n = 42
for _ in range(n):
    print("hello,world!")

三、國際化blog

」_「被做爲一個函數來使用。它一般用於實現國際化和本地化字符串之間翻譯查找的函數名稱,這彷佛源自並遵循相應的C約定。例如,在Django文檔「轉換」章節中,你將能看到以下代碼:文檔

from django.utils.translation import ugettext as _
from django.http import HttpResponse
def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)

能夠發現,場景二和場景三中的使用方法可能會相互衝突,因此咱們須要避免在使用「_」做爲國際化查找轉換功能的代碼塊中同時使用「_」做爲臨時名稱。字符串

 

名稱前的單下劃線(如:_shahriar)

變量名前使用一個單下劃線,稱爲保護變量。相似於慣例,其餘人(或你本身)使用這些代碼時將會知道以「_」開頭的名稱只供內部使用。應該將它們看做是一種實現細節,在修改它們時無需對外部通知。get

它對解釋器來講有必定的意義,若是你寫了代碼「from <模塊/包名> import *」,那麼以「_」開頭的名稱都不會被導入,除非模塊或包中的「__all__」列表顯式地包含了它們。瞭解更多請查看「Importing * in Python」。it

 

名稱前的雙下劃線(如:__shahriar)

變量名(屬性方法名)前加雙下劃線__稱爲私有變量,這種用法對解釋器來講有特定的意義。Python中這種用法是爲了不與子類定義的名稱衝突。「__spam」這種形式的標識符將會被「_classname__spam」這種形式取代,在這裏「classname」是去掉前導下劃線的當前類名。以下:

>>> class Animal(object):
... def _dog(self):
... pass
... def __cat(self):
... pass
...
>>> dir(Animal())
['_Animal__cat', ..., '_dog']

 

正如所預料的,「_dog」並未改變,而「__cat」卻被變成了「_Animal__cat」。此時,若是你建立Animal的一個子類B,那麼你將沒法輕易覆蓋Animal中的方法「__cat」。

>>> class B(A):
... def __cat(self):
... pass
...
>>> dir(B())
['_Animal__cat', '_B__cat', ..., '_dog']

這裏的功能幾乎和Java中的final方法和C++類中標準方法(非虛方法)同樣。

 

名稱先後的雙下劃線(如:__init__)

這種用法表示Python中特殊的方法名。其實,這只是一種慣例,對Python系統來講,這將確保不會與用戶自定義的名稱衝突。一般,你能夠覆蓋這些方法,並在裏面實現你所須要的功能,以便Python調用它們。例如,當定義一個類時,你常常會覆寫「__init__」方法。

雖然你也能夠編寫本身的特殊方法名,但不要這樣作。

>>> class C(object):
... def __mine__(self):
... pass
...
>>> dir(C)
... [..., '__mine__', ...]

其實,很容易擺脫這種類型的命名,而只讓Python內部定義的特殊名稱遵循這種約定。

相關文章
相關標籤/搜索