python中的下划线_讲解
python中,下劃線 "_""_" 不管是單獨作為變量名或者作為變量名的前綴或者后綴,是有特殊含義的,下面簡要的來總結一下。
1, 單下劃線 "_""_"
在python3中,單下劃線 "_""_" 默認為空字符串變量,如下圖: 
  
 一旦交互式解釋器會話中上一條語句執行的結果沒有通過賦值語句賦值給一個變量,則該值默認賦值給 "_""_" ,如下圖所示: 
 
單下劃線 "_""_" 也可以作為臨時變量來使用,例如,下面的例子中,你可能對循環計數中的實際值并不感興趣,此時就可以使用 "_""_" 。
n = 42 for _ in range(n): do_something()2,作為變量前的單下劃線 "_""_",如_xxx
python中單下劃線開頭的變量,標明是一個受保護(protected)的變量,原則上不允許直接訪問,但外部類還是可以訪問到這個變量的。 
 這只是程序員之間的一個約定,用于警告說明這是一個私有變量,外部類不要去訪問它。 
 如下所示,在Student類中定義了一個受保護變量_name,外部是可以訪問到這個變量的,但是不推薦這樣干。
另外在以"_""_"開頭的名稱都不會被“from<模塊/包名>import?”“from<模塊/包名>import?” 這種形式導入,這種情況也適用于__xxx, __xxx__,如下所示,簡單的在模塊test1中定義4個模塊變量,然后在模塊test2中以from test1 import *形式導入。
模塊test1.py:
'''模塊test1.py''' '''定義4個模塊變量''' num = 20 _num = 90 __num = 900 __num__ = 10模塊test2.py:
'''模塊test2.py''' from test1 import *print(num) #輸出20 print(_num) #報錯,name '_num' is not defined print(__num) #報錯,name '__num' is not defined print(__num__) #報錯,name '__num__' is not defined如果是import test1的形式導入是沒問題的:
模塊test2.py:
'''模塊test2.py''' import test1print(test1.num) #輸出20 print(test1._num) #輸出90 print(test1.__num) #輸出900 print(test1.__num__) #輸出103,作為變量前的雙下劃線 "__""__",如__xxx
在Python中,實例的變量名如果以__開頭,就變成了一個私有變量(private),只有內部可以訪問,外部不能訪問,因為Python解釋器對外把 __xxx變量改成了_classname__xxx,所以,仍然可以通過_classname__xxx來訪問__xxx變量:所以,我們把test1.py中的Student類改一改:
class Student:def __init__(self, name, age):self.__name = nameself.age=agestu = Student('hello',30) print(stu.age) #輸出30 print(stu.__name) #報錯:AttributeError: 'Student' object has no attribute '__name' print(stu._Student__name) #輸出hello4,變量前后的雙下劃線 如__xxx__
這種用法表示Python中特殊的方法名。其實,這只是一種慣例,對Python系統來說,這將確保不會與用戶自定義的名稱沖突。通常,你將會 覆寫這些方法,并在里面實現你所需要的功能,以便Python調用它們。例如,當定義一個類時,你經常會覆寫“__init__”方法。
雙下劃線開頭雙下劃線結尾的是一些 Python 的“魔術”對象,如類成員的 __init__、__del__、__add__、__getitem__ 等,以及全局的 __file__、__name__ 等。 Python 官方推薦永遠不要將這樣的命名方式應用于自己的變量或函數,而是按照文檔說明來使用。 雖然你也可以編寫自己的特殊方法名,但不要這樣做。
5,題外話 if __name__ == “__main__”:
經常在一些python程序中看見這樣的寫法。
因為所有的 Python 模塊都是對象并且有幾個有用的屬性,你可以使用這些屬性方便利的測試你所書寫的模塊。
模塊是對象, 并且所有的模塊都有一個內置屬性 __name__。一個模塊的 __name__ 的值要看您如何應用模塊。如果 import 模塊, 那么__name__的值通常為模塊的文件名, 不帶路徑或者文件擴展名。但是您也可以像一個標準的程序一樣直接運行模塊, 在這種情況下__name__的值將是一個特別的缺省值:__main__。
6,總結:
需要注意的是,在Python中,變量名類似__xxx__的,也就是以雙下劃線開頭,并且以雙下劃線結尾的,是特殊變量,特殊變量是可以直接訪問的,不是private變量,所以,不能用__name__、__age__這樣的變量名。
有些時候,你會看到以一個下劃線開頭的實例變量名,比如_name,這樣的實例變量外部是可以訪問的,但是,按照約定俗成的規定,當你看到這樣的變量時,意思就是,“雖然我可以被訪問,但是,請把我視為私有變量,不要隨意訪問”。
雙下劃線開頭的實例變量是不是一定不能從外部訪問呢?其實也不是。不能直接訪問__xxx是因為Python解釋器對外把__xxx變量改成了_classname__xxx,所以,仍然可以通過_classname__xxx來訪問__xxx變量。
參考
總結
以上是生活随笔為你收集整理的python中的下划线_讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 【Python特性】Python中的下划
- 下一篇: Disabling usage of P
