Python中下劃線的使用方法
Python中的很多事情,下劃線的不同用法大多數(並非所有)只是常用慣例而已。以下是小編為大家搜索整理的Python中下劃線的使用方法,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!
單下劃線(_)
通常情況下,會在以下3種場景中使用:
1、在解釋器中:在這種情況下,“_”代表交互式解釋器會話中上一條執行的語句的結果。這種用法首先被標準CPython解釋器採用,然後其他類型的解釋器也先後採用。
?
12345678910 | >>> _ Traceback (most recent call last):File "<stdin>", line 1, in <module>NameError: name '_' is not defined>>> 42>>> _42>>> 'alright!' if _ else ':(''alright!'>>> _'alright!' |
2、作為一個名稱:這與上面一點稍微有些聯繫,此時“_”作為臨時性的名稱使用。這樣,當其他人閲讀你的.代碼時將會知道,你分配了一個特定的名稱,但是並不會在後面再次用到該名稱。例如,下面的例子中,你可能對循環計數中的實際值並不感興趣,此時就可以使用“_”。
?
123 | n = 42for _ in range(n):do_something() |
3、國際化:也許你也曾看到”_“會被作為一個函數來使用。這種情況下,它通常用於實現國際化和本地化字符串之間翻譯查找的函數名稱,這似乎源自並遵循相應的C約定。例如,在Django文檔“轉換”章節中,你將能看到如下代碼:
?
12345 | from slation import ugettext as _from import HttpResponsedef 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”是去掉前導下劃線的當前類名。例如下面的例子:
?
12345678 | >>> 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”。
?
123456 | >>> class B(A):... def __method_name(self):... pass...>>> dir(B())['_A__method_name', '_B__method_name', ..., '_internal_use'] |
這裏的功能幾乎和Java中的final方法和C++類中標準方法(非虛方法)一樣。
名稱前後的雙下劃線(如:__init__)
這種用法表示Python中特殊的方法名。其實,這只是一種慣例,對Python系統來説,這將確保不會與用户自定義的名稱衝突。通常,你將會覆寫這些方法,並在裏面實現你所需要的功能,以便Python調用它們。例如,當定義一個類時,你經常會覆寫“__init__”方法。
雖然你也可以編寫自己的特殊方法名,但不要這樣做。
?
123456 | >>> class C(object):... def __mine__(self):... pass...>>> dir(C)... [..., '__mine__', ...] |
其實,很容易擺脱這種類型的命名,而只讓Python內部定義的特殊名稱遵循這種約定。
-
JavaScript 函數表達式
JavaScript中創建函數主要有兩種方法:函數聲明和函數表達式。這兩種方式都有不同的適用場景。這篇筆記主要關注的是函數表達式的幾大特點以及它的使用場景,下面一一描述。主要特點可選的函數名稱函數名稱是函數聲明的必需組成部分,這個函數名稱相當於一個變量,新定...
-
jQuery中的read和JavaScript中的onload函數的區別在哪
在JavaScript中,onload函數是最經常使用的,幾乎涉及到JavaScript的童鞋都少不了要接觸它。這個函數的作用就是等待網頁完全裝載完了以後再去執行代碼塊內的語句,因為按照文檔流的執行順序,通常用於頭部加載JavaScript的`時候需要用到。複製代碼代碼如下:ad=functio...
-
javascript包裝對象的用法
js對象是一種複合值:它是屬性或已命名值得集合。參考以下代碼:vars="helloworld";varlen=th;在該例子中,s是字符串,而字符串不是對象,但為何會有屬性呢?其實只要引用了字符串s的屬性,js就會將字符串通過調用newString(s)的方式轉換為對象,該對象繼承了字符串的方法,並被...
-
javascript中的return和閉包函數
複製代碼代碼如下:functionmakefunc(x){returnfunction(){returnx;}}alert(makefunc(0));其實不是不執行,只是朋友的意思這裏alert出來的`應該是“0”,而不是function(){returnx;}。不是腳本寫錯了,只是沒搞懂return,從當前函數退出,並從那個函數返回一個值。如果返...