前言
1、前后各有兩個下划線,說明是類的內置方法,用於操作符重載等用途,自己寫的函數避免使用前后兩個下划線。
【變量名__xxx__對Python來說有特殊含義,像__self__,__class___,代表自身等,系統定義的,有特殊含義的,你可以覆蓋它,在里面寫一些自定義初始化的一些東西】
2、前面有兩個下划線,表示偽私有方法,不能在類外用原始名字直接調用。
3、前面一個下划線,表示自己寫的特殊用途的方法。
作用
①單下划線用於python解釋器,表示上一次的執行結果
即使不把 Python 用於編程,也可以把它用作智能計算器,下划線保存上次的計算結果,在計算時相當方便:
②代碼中一個獨立的下划線,表示這個變量不重要
一個獨立的下划線,它也是一個變量名;只不過它比較特殊,當你使用下划線作為變量名時,就代表你告訴大家,這個變量不重要,僅僅占個位置,可以忽略,后面不會再使用它。
當然了,這只是一種約定俗成,你要是不遵守也是可以的,畢竟在后面還可以通過下划線來獲取這個變量的值。
例如:
for i, _ in [(1, 2), (3, 4)]: print(i)
上面的代碼表示我們只需要列表內部元組的第一個,第二個其實賦值給了下划線,雖然后面你可以通過下滑線來取到值,但是強烈建議你不要這么做,這違反了約定。
③類的內部,雙下划線作為變量名或函數名的開頭,表示私有
私有變量或函數,只能在類的內部來使用,不可在外部訪問或更改;
比如,在 module_b.py 中有一個類 A,類 A 有一個雙下划線開頭的變量名:
class A: __private_var = 1000 def __init__(self) -> None: self.__private_var2 = 2000 self.var3 = 3000
當我們在另一個文件中引用 A 時,就無法訪問到私有變量:
import module_b if __name__ == '__main__': a = module_b.A() print(a.__private_var)
報錯:
當然了,如果你一定要訪問,也是可以的,只需在私有變量前加個 _類名 ,比如上面的代碼中改為 print(a._A__private_var) 就可以正確打印1000。
例如:
class A: __private_var = 1000 def __init__(self) -> None: self.__private_var2 = 2000 self.var3 = 3000 if __name__ == '__main__': a = A() print(a._A__private_var) # 1000
不能直接訪問 __private_var 是因為 Python 解釋器對外把 __private_var 變量改成了 _A__private_var :
有些時候,你會看到以一個下划線開頭的實例變量名,比如 _name
,這樣的實例變量外部是可以訪問的,但是,按照約定俗成的規定,當你看到這樣的變量時,意思就是,“雖然我可以被訪問,但是,請把我視為私有變量,不要隨意訪問”。
Python 本身沒有任何機制阻止你干壞事,一切全靠自覺。
④雙下划線開頭和結尾的方法,是魔術方法
比如常見的 __init__ , __dict__ , __dir__ , __doc__ , __eq__ 等等。
具體可以閱讀如何寫出令人驚嘆的Python類
⑤作為變量名中間的一部分
相比駝峰命名,這叫做蛇形命名,比如user_name。
⑥作為數字中間的一部分,更易讀
print(10_000_000) # 10000000 print(1_280_500_000 == 1280500000) # True