一般狀況下,會在如下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)
能夠發現,場景二和場景三中的使用方法可能會相互衝突,因此咱們須要避免在使用「_」做爲國際化查找轉換功能的代碼塊中同時使用「_」做爲臨時名稱。字符串
變量名前使用一個單下劃線,稱爲保護變量。相似於慣例,其餘人(或你本身)使用這些代碼時將會知道以「_」開頭的名稱只供內部使用。應該將它們看做是一種實現細節,在修改它們時無需對外部通知。get
它對解釋器來講有必定的意義,若是你寫了代碼「from <模塊/包名> import *」,那麼以「_」開頭的名稱都不會被導入,除非模塊或包中的「__all__」列表顯式地包含了它們。瞭解更多請查看「Importing * in Python」。it
變量名(屬性方法名)前加雙下劃線__稱爲私有變量,這種用法對解釋器來講有特定的意義。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++類中標準方法(非虛方法)同樣。
這種用法表示Python中特殊的方法名。其實,這只是一種慣例,對Python系統來講,這將確保不會與用戶自定義的名稱衝突。一般,你能夠覆蓋這些方法,並在裏面實現你所須要的功能,以便Python調用它們。例如,當定義一個類時,你常常會覆寫「__init__」方法。
雖然你也能夠編寫本身的特殊方法名,但不要這樣作。
>>> class C(object): ... def __mine__(self): ... pass ... >>> dir(C) ... [..., '__mine__', ...]
其實,很容易擺脫這種類型的命名,而只讓Python內部定義的特殊名稱遵循這種約定。