python下划線變量的含義


_xxx      不能用'from module import *'導入 
__xxx__ 系統定義名字 
__xxx    類中的私有變量名

核心風格:避免用下划線作為變量名的開始。

"單下划線" 開始的成員變量叫做保護變量,意思是只有類對象和子類對象自己能訪問到這些變量;如果修改,無需通知外部。
"雙下划線" 開始的是私有成員,意思是只有類對象自己能訪問,連子類對象也不能訪問到這個數據。

以單下划線開頭(_foo)的代表不能直接訪問的類屬性,需通過類提供的接口進行訪問,不能用“from xxx import *”而導入;除非在__init__.py中使用__all__顯示定義。

以雙下划線開頭的(__foo)代表類的私有成員;編譯時會翻譯成:_classname__foo, 且不會被子類覆蓋。

以雙下划線開頭和結尾的(__foo__)代表python里特殊方法專用的標識,如 __init__()代表類的構造函數。

 

以下轉自 http://python.jobbole.com/81129/

單下划線:

單獨使用:

1. 在解釋器中:在這種情況下,"_"代表交互式解釋器會話中上一條執行的語句的結果。這種用法首先被標准CPython解釋器采用,然后其他類型的解釋器也先后采用

2. 作為一個名稱:這與上面一點稍微有些聯系,此時"_"作為臨時性的名稱使用。這樣,當其他人閱讀你的代碼時將會知道,你分配了一個特定的名稱,但是並不會在后面再次用到該名稱。例如,下面的例子中,你可能對循環計數中的實際值並不感興趣,此時就可以使用"_"。

for _ in range(3):
    do_something()

3. 國際化:也許你也曾看到"_"會被作為一個函數來使用。這種情況下,它通常用於實現國際化本地化字符串之間翻譯查找的函數名稱,這似乎源自並遵循相應的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)

程序員使用名稱前的單下划線,用於指定該名稱屬性為“私有”。這有點類似於慣例,為了使其他人(或你自己)使用這些代碼時將會知道以“_”開頭的名稱只供內部使用。

正如Python文檔中所述:

以下划線“_”為前綴的名稱(如_spam)應該被視為API中非公開的部分(不管是函數、方法還是數據成員)。此時,應該將它們看作是一種實現細節,在修改它們時無需對外部通知。

正如上面所說,這確實類似一種慣例,因為它對解釋器來說確實有一定的意義,如果你寫了代碼“from <模塊/包名> import *”,那么以“_”開頭的名稱都不會被導入,除非模塊或包中的“__all__”列表顯式地包含了它們。了解更多請查看“Importing * in Python”。

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

名稱(具體為一個方法名)前雙下划線(__)的用法並不是一種慣例,對解釋器來說它有特定的意義。Python中的這種用法是為了避免與子類定義的名稱沖突。

Python文檔指出,“__spam”這種形式(至少兩個前導下划線,最多一個后續下划線)的任何標識符將會被“_classname__spam”這種形式原文取代,在這里“classname”是去掉前導下划線的當前類名。例如下面的例子:

>>> class A(object): 
... def _internal_use(self): 
...     pass 
... def __method_name(self): 
...     pass 
... 
>>> dir(A()) 
['_A__method_name', ..., '_internal_use']

正如所預料的,“_internal_use”並未改變,而“__method_name”卻被變成了“_ClassName__method_name”。

此時,如果你創建A的一個子類B,那么你將不能輕易地覆寫A中的方法“__method_name”。

>>> class B(A): 
... def __method_name(self): 
... pass 
... 
>>> dir(B()) 
['_A__method_name', '_B__method_name', ..., '_internal_use']

名稱前后的雙下划線(如:__init__)

這種用法表示Python中特殊的方法名。其實,這只是一種慣例,對Python系統來說,這將確保不會與用戶自定義的名稱沖突。

通常,你將會覆寫這些方法,並在里面實現你所需要的功能,以便Python調用它們。例如,當定義一個類時,你經常會覆寫“__init__”方法。

雖然你也可以編寫自己的特殊方法名,但不要這樣做。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM