python中class __str__怎么用_python中下划线的作用
學習python的時候,我們經常碰到一些變量的變量名帶單下劃線/雙下劃線前綴或者后綴,然后會覺得這樣的命名風格很奇怪。除了變量命名風格外,也會遇到下劃線的表達式,也會讓人摸不著頭腦。今天我們就來看下,python中下劃線的作用。
忽略值
這是我們經常遇到的情況,比如調用某個函數,該函數會返回一組值,可是我們想要的返回值可能只是里面的某個,比如某函數除了返回關鍵屬性值外還會返回一個狀態碼,而程序里可能只要狀態碼,那么可以這樣
def你可以把不需要的值賦值給下劃線_
解釋器里上個表達式的值
在解釋器中,這里的下劃線保存了上個表達式的值
>>> 1 + 2 3 >>> _ * 2 6私有變量
python里并沒有關鍵字去定義類的成員方法和成員變量是私有或者公有的,不像Java里有private,public或者protected。python里做法是在給變量命名的時候添加一個下劃線前綴,然而你會發現即使做了這樣的命名,但是解釋器在運行程序時,如果外界直接調用對象私有成員是不會報錯的,所以這也被稱為弱私有,并非強制。但這個是一個約定俗稱的規定,雖然不受解釋器限制,但作為python程序員,一旦遇到這樣的情況,你心里就應該清楚,我不應該在外面直接去對實例成員做操作,請參閱PEP8。
class執行u._name = "hello"并沒有報錯,執行結果:
hi hello還有一種情況,你可以顯示的看到這個私有變量命名風格的效果,那就是在某模塊里定義一個私有變量后,在其他模塊用 from module import *導入到當前空間里是無法導入的。不過如果不用通配符*,具體指定對象名,私有變量依然可以被導入。
避免與python關鍵字或者內置對象名沖突
用后綴單下劃線可以避免與python關鍵字或者內置對象名沖突
比如 len_ = 10
Name mangling
網上很多文章說到雙下劃線前命名的變量才是私有變量,其實我覺得私有成員的聲明還是靠命名規則約定而且并非解釋器限制的單下劃線“_”?!癬_”只是營造出了“私有成員”的效果而已。簡單來說,python解釋器會把類中的以“__”前綴的變量名重新定義(name mangling), 該變量名被將替換為“_Classname__variable”,其中“Classname”是當前類名. 這樣也避免了從父類繼承的子類中出現的命名沖突。有點拗口,我們看個例子
class運行結果
['_User__pwd', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_name', 'get_name', 'get_pwd']你會發現,u對象成員變量__pwd被改名成了_User__pwd,當你從外面直接操作u.__pwd,當然會報沒有這個字段的錯誤,所以也就造成了私有成員的效果,其實本質它被改名了,你仍然可以通過u._User__pwd去訪問。
如果我們在寫一個類去繼承User,并在里面同樣定義成員變量__pwd,看看會發生什么
class運行結果
['_User__pwd', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_name', 'get_name', 'get_pwd'] ['_Guest__pwd', '_User__pwd', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_name', 'get_name', 'get_pwd']我們看到Guest對象的__pwd被重新改名叫_Guest__pwd。
Magic method
前綴后綴雙下劃線變量是python中的特殊成員,比如__init__,__new__,它們都有自己的特殊用處,所被稱為magic method,所以定義自己的變量時不要使用前綴后綴下劃線命名。
總結
以上是生活随笔為你收集整理的python中class __str__怎么用_python中下划线的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 「重点」如何一笔画出4条直线穿过9个点
- 下一篇: 华为智慧屏S86 Pro配备AG防眩屏,