概述
python中的下划線主要分為如下幾類:
-
前置單下划線,如_a,_variable,主要是用於將變量或方法定義為私有屬性。這里的私有屬性並非如java中的私有,而是一種約定俗成,想強行訪問仍舊可以正常訪問。
-
后置單下划線,如a_,val_,主要用於將變量區別,如變量名稱和關鍵字沖突,后面加個下划線區別開來。
-
前置雙下划線,如__val,類中帶前置雙下划線的變量或方法,都會觸發python解釋器的名稱修飾,是不能直接通過該名稱去訪問到的,實現了一定程度上的隔離。
-
前后都有雙下划線,如__init__,這類方法是python中的魔法方法,可以去重載。
-
單下划線本身如 _,主要用於無意義的變量名。
前置單下划線
將變量名,方法名指定為私有屬性,但在外部仍舊可以訪問到。這里只是一種約定俗成,對於私有方法或變量名,代表該對象/模塊的這類方法或者變量不想暴露出來,應盡量避免訪問私有屬性或方法。
舉例:
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
前置雙下划線
用雙下划線修飾屬性或者方法,會出發名稱修飾,即在外部訪問時,該方法名或變量名會變為 _類名__變量名;直接訪問__變量名是不存在的。
舉例:
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
可以看到,這種情況下最好定義一個接口去直接訪問。因為內部名稱還是沒變的,名稱修飾主要是在實例化后調用屬性或者方法時作用了。
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結合起來使用。
單下划線本身_
舉例:
>>>a=[_ for _ in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>a,_,_,d=func(*args,**kwargs)
#這種情況是我們只想要返回的第一個和第四個參數,中間兩個對於當前模塊沒啥意義,就無需去定義一個變量名稱。