2019-12-16 22:45:29
python中下劃線有各種各樣的作用,本章就來分別介紹一下各種下劃線的功能。
一、開頭單下劃線 _var
開頭單下劃線還是挺常用的,在類中表示為保護變數/保護函式,但是需要注意的是,這個只是一種約定俗成,這不是python強制規定的。
換言之,你依然可以訪問乙個類中以單下劃線開頭的變數或者方法而不報錯。
class a:def __init__(self):
self.a = 1
self._b = 2
def _func(self):
print("hello world.")
if __name__ == "__main__":
aa = a()
print(aa.a)
print(aa._b)
aa._func()
上述的**執行是完全沒有任何的問題的,這是因為python中的單個下劃線字首僅僅是乙個約定 - 至少相對於變數和方法名而言。
但是,前導下劃線的確會影響從模組中匯入名稱的方式。
假設你在乙個名為my_module的模組中有以下**:
# this is my_module.py:def external_func():
return 23
def _internal_func():
return 42
現在,如果使用萬用字元從模組中匯入所有名稱,則python不會匯入帶有前導下劃線的名稱:
>>> from my_module import *>>> external_func()
23>>> _internal_func()
nameerror: "name '_internal_func' is not defined"
當然,如果不是使用萬用字元進行的匯入,那麼依然是不會出現任何的問題的,事實上,我們也不建議使用萬用字元的方式來進行方法的匯入。
二、開頭雙下劃線 __var
上述的單下劃線開頭有點類似於君子協定,看到了就是告訴你這個是私有的,不能外部訪問的,但是實際上你要外部訪問也沒轍。但是,開頭雙下劃線的就不一樣了,這個在python中有固定的使用方式的。
雙下劃線字首會導致python直譯器重寫屬性名稱,以避免子類中的命名衝突。
python會對以雙下劃線開頭的變數或者方法的name進行重寫(_classname__var),在外部訪問的時候如果直接按照變數名訪問就會報錯。
class test:def __init__(self):
self.foo = 11
self._bar = 23
self.__baz = 23
def get_var(self):
print(self.__baz) # 內部可以直接訪問
def __method(self):
print("this is method.")
if __name__ == "__main__":
a = test()
# print(a.__baz) # attributeerror: 'test' object has no attribute '__baz'
print(a._test__baz)
# 對內透明
a.get_var()
# a.__method() # attributeerror: 'test' object has no attribute '__method'
a._test__method()
三、開頭末尾雙下劃線
如果乙個名字同時以雙下劃線開始和結束,則不會應用名稱修飾。 由雙下劃線字首和字尾包圍的變數不會被python直譯器修改:
class prefixpostfixtest:def __init__(self):
self.__bam__ = 42
>>> prefixpostfixtest().__bam__
42
但是,python保留了有雙前導和雙末尾下劃線的名稱,用於特殊用途。 這樣的例子有,__init__物件建構函式,或__call__ --- 它使得乙個物件可以被呼叫。
這些dunder方法通常被稱為神奇方法 - 但python社群中的許多人(包括我自己)都不喜歡這種方法。
最好避免在自己的程式中使用以雙下劃線(「dunders」)開頭和結尾的名稱,以避免與將來python語言的變化產生衝突。
SWIFT 神奇的下劃線
在swift在。有許多神奇的下劃線,在這裡,我們將看到神奇的彙總,我希望能夠幫助其他很多學習swift朋友。通過使用下劃線能夠提高數字字面量的可讀性,比如 let paddeddouble 123.000 001 let onemillion 1 000 000 當我們使用元組時,假設有的元素不須要...
神奇的雙下劃線查詢
神奇的雙下劃線查詢 1 年齡大於35歲的資料 res models.user.objects.filter age gt 35 print res 2 年齡小於35歲的資料 res models.user.objects.filter age lt 35 print res 大於等於 小於等於 re...
Python單下劃線和雙下劃線
python 用下劃線作為變數字首和字尾指定特殊變數。不能用 from moduleimport 匯入 系統定義名字 類中的私有變數名 核心風格 避免用下劃線作為變數名的開始。因為下劃線對直譯器有特殊的意義,而且是內建識別符號所使用的符號,我們建議程式設計師避免用下 劃線作為變數名的開始。一般來講,...