python中的下劃線主要分爲以下幾類:java
將變量名,方法名指定爲私有屬性,但在外部仍舊能夠訪問到。這裏只是一種約定俗成,對於私有方法或變量名,表明該對象/模塊的這類方法或者變量不想暴露出來,應儘可能避免訪問私有屬性或方法。python
舉例:code
class A(object): def __init__(self): self._private=0 def _private_method(self): print('AAAAA') >>>a=A() >>>a._private 0 >>>a._private_method()#均能直接訪問 AAAAA
主要用於區分變量名對象
def_=3 int_=5
用雙下劃線修飾屬性或者方法,會出發名稱修飾,即在外部訪問時,該方法名或變量名會變爲 \_類名\_\_變量名;直接訪問__變量名是不存在的。接口
舉例:get
class A(object): def __init__(self): self.__private=0 def __private_method(self): print('AAAAA') >>>a=A() >>>a.__private Traceback (most recent call last): File "<input>", line 1, in <module> AttributeError: 'A' object has no attribute '__private' >>>a.__private_method()# Traceback (most recent call last): File "<input>", line 1, in <module> AttributeError: 'A' object has no attribute '__private_method' >>>a._A__private 0 >>>a._A__private_method() AAAAA
能夠看到,這種狀況下最好定義一個接口去直接訪問。由於內部名稱仍是沒變的,名稱修飾主要是在實例化後調用屬性或者方法時做用了。input
class A(object): def __init__(self): self.__private=0 def __private_method(self): print('AAAAA') def get_p(self): return self.__private >>>a=A() >>>a.get_p() 0
包括上面的單下劃線規約的私有屬性,也能夠經過定義接口方法去訪問,這樣的好處是私有的方法或者屬性沒法被篡改,能夠很好的保護起來。這裏能夠和@property結合起來使用。it
舉例:ast
>>>a=[_ for _ in range(10)] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>>a,_,_,d=func(*args,**kwargs) #這種狀況是咱們只想要返回的第一個和第四個參數,中間兩個對於當前模塊沒啥意義,就無需去定義一個變量名稱。