python 神奇的下劃線

2022-08-11 08:45:15 字數 2337 閱讀 4272

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 匯入 系統定義名字 類中的私有變數名 核心風格 避免用下劃線作為變數名的開始。因為下劃線對直譯器有特殊的意義,而且是內建識別符號所使用的符號,我們建議程式設計師避免用下 劃線作為變數名的開始。一般來講,...