1. 程式人生 > >Python語言特性-下劃線

Python語言特性-下劃線

**python 中的識別符號可以包含數字、字母和 ,但必須以字母或者 _ 開頭,
而以 下劃線 (
) 開頭的命名一般具有特殊的意義。**下劃線對 python 的意義不同於其他語言,分單下劃線、雙下劃線,並且有字首有後綴。總的來說有五種形式。

單雙劃線的 5 種形式:

單一下劃線:_
開頭單下劃線:_var
結尾單下劃線:var_
開頭雙下劃線:__var
開頭結尾雙下劃線:__var__

一. 單一下劃線:_
單一下劃線作為變數相當於一個約定,通常用來表示不會被使用的臨時變數,只是不可匹配時用來佔位的臨時變數

>>> car=('red','auto','12','230000')
>>> color,_,_,money=car
>>> color
'red'
>>> money
'230000'

二. 開頭單下劃線:_var

這樣的物件叫做保護變數,不能用 from module import * 形式匯入,只有類物件和子類物件能訪問這些變數。

單下劃線只是 python 社群一個約定俗成的規定,用來提醒程式設計師以單下劃線開頭的變數和方法僅供類內部使用即私有變數或方法,不是公共介面的一部分。

python 中並沒有嚴格的私有方法和公有方法,這裡單下劃線更像一個善意的提醒。就好像告訴程式設計師:我可以被訪問和呼叫,但請最好不要呼叫我。

class Test:     
    def __init__(self):
        self.foo=11
        self._bar=12.5
 >>> t=Test()
 >>> t.foo
 11
 >>> t._bar
 12.5       

三. 結尾單下劃線:var_

有的時候,有些變數命被關鍵字所佔用,這個時候在結尾新增一個單下劃線,可以避免命名衝突。

這裡就不再贅述。

四. 開頭雙下劃線:__var

類中的私有成員,只有類物件自己能訪問,子類物件也不能訪問到這個成員,但在物件外部可以通過 物件名._類名__xxx 這樣的特殊方式來訪問。

開頭雙下劃線會使 python 直譯器改變當前變數的名字(name mangling)從而避免子類中可能出現的命名衝突

class Test:
    def __init__(self):
        self.foo = 11
        self._bar = 23
        self.__baz = 23

t=Test()
dir(t)

五. 開頭和結尾雙下劃線:var

開頭和結尾雙下劃線的用法又被稱為 魔術方法,命名重置(name mangling)對它不生效,不會修改名稱。
python中一般用於特殊方法的命名,用來實現物件的一些行為或者功能,比如 new() 方法用來建立例項;init() 方法用來初始化物件等等。

class Hero(object): 
    # 如果類面沒有寫__init__方法,Python會自動建立,但是不執行任何操作,
    def __init__(self):
        self.name = "泰達米爾" 
        self.hp = 2600 
      

上面提到的 init()方法,在建立一個物件時預設被呼叫,不需要手動呼叫。
且__init__(self)中的self引數,不需要開發者傳遞,python直譯器會自動把當前的物件引用傳遞過去。

總結
單下劃線 (_) :
1.在 CPython 等直譯器中代表互動式直譯器會話中上一條執行的語句的結果
2.作為臨時性的名稱使用,分配了一個特定的名稱但是在後面不會用到該名稱
3.用於實現國際化和本地化字串之間翻譯查詢的函式名稱(遵循相應的C約定)
4.名稱前的單下劃線,用於指定該名稱屬性為 私有,這並不是語法規定而是慣例,在使用這些程式碼時將大家會知道以 _ 開頭的名稱只供內部使用,在 from import * 時,以 _ 開頭的名稱都不會被匯入,除非模組或包中的 all 列表顯式地包含了它們

雙下劃線 (__)
1.一個方法名前面加上雙下劃線(__)並不是慣例,它對直譯器來說有特定的意義。Python 中的這種用法是為了避免與子類定義的名稱衝突。
2.名稱前後的雙下劃線表示 Python 中特殊的方法名。這只是一種慣例,對 Python 來說,這將確保不會與使用者自定義的名稱衝突。通常,程式設計師會重寫這些方法,並在裡面實現所需要的功能,以便Python 呼叫。