首先原諒一個菜鳥叫他“兩頭下划線”。記得在windows編程中,很多宏定義使用下划線+大寫,給人逼格很高的錯覺。對於Python下划線的認識,大概是從__dict__這個屬性開始的,看__dict__的名字,首先她是一個字典,key是類或對象的所有成員,value是成員對應的值。我們舉個簡單的例子說明單下划線,雙下划線,兩頭下划線的區別。
>>> class student(object): __name = 0 _sex = 'male' >>> student.__dict__ mappingproxy({'__module__': '__main__', '_student__name': 0, '_sex': 'male', '__dict__': <attribute '__dict__' of 'student' objects>, '__weakref__': <attribute '__weakref__' of 'student' objects>, '__doc__': None}) >>> student.__name Traceback (most recent call last): File "<pyshell#58>", line 1, in <module> student.__name AttributeError: type object 'student' has no attribute '__name' >>> student._student__name 0 >>> student._sex 'male'
總結:我們聲明了一個學生類,分別用但下划線和雙下划線定義了一個成員,然后我們試圖訪問成員,我們發現:雙下划線的成員無法直接訪問,通過__dict__我們看到,在類的內部,Python自動將__name 解釋成 _student__name,於是我們用 _student__name訪問,這次成功。然而,_name不受影響。所以:
兩頭下划線:Python類內置成員專用,區別用戶自定義成員
單下划線:類的普通成員
爽下划線:解析器自動轉換為:_類名__成員名,代替原有成員,訪問需要在原有成員名字前加上_類名。
