單劃線(_)
在解譯器中
在解譯器中,_代表互動式解譯器會話中上一條的執行結果。這種用法有點類似於Linux中的上一條命令的用法。只不過在在Python解譯器中表示的上一條執行的結果。
>>> "alright"
'alright'
>>> _
'alright
作為一個名稱
作為臨時性的名稱使用,但是在後面不會再次用到該名稱。這種用法在迴圈中會經常用到。
for _ in range(10):
do_something()
作為函數的串連符,僅僅是一種函數名的命名方式,就如同Java的駝峰式的命名法是一樣的。
def add_user(user):
do_something
名稱前的單劃線(_get_content)
在Python文檔中的解釋是:以底線_為首碼的名稱(如_get_content)應該被是被API非公開的一部分不管是函數、方法還是屬性。此時應該將她們看作一種實現細節,在修改他們的時候無需對外部進行通知。
當使用了以底線_為首碼的名稱,那麼在使用from <模組/包名> import *時,以_開頭的名稱都不會被匯入,除非是模組或包中的__all__列表顯式地包含了他們。
由於這種寫法僅僅是表示一種細節的實現,在類繼承時仍然是可以繼承的。
class people(object):
def _eat(self):
print('I am eating')
class Student(people):
@property
def birth(self):
return self._brith
@birth.setter
def birth(self,value):
self._birth = value
@property
def age(self):
return self._age
s = Student()
s._eat() #輸出: I am eating
名稱前的雙底線(如:__run)
名稱前帶有雙底線的變數,表示的是一個私人函數,無法被繼承,也無法在外部存取。
class People(object):
def _eat(self):
print('I am eating')
def __run(self):
print('I can run')
class Student(People):
def torun(self):
self.__run() #出錯,因為people的方法無法被繼承,在Student中不存在__run()方法
s = Student()
s.torun()
p = People()
p.__run() #出錯,因為私人函數無法在外部存取
《Python學習手冊》的說明,以雙底線開頭的變數名,會自動擴張,從而包含了所在類的名稱。例如在Spam類中的X這樣的變數名會自動編程_SpamX:原始的變數名會在頭部加入一個底線,然後是所在類名稱。
dir(People) #輸出:_People__run,_eat,...
名稱前後的雙底線(如init)
前後有雙底線表示的是特殊函數。通常可以複寫這些方法實現自己所需要的功能。最常見的就是複寫__init__方法。
class People(object):
def __init__(self, arg):
super(People, self).__init__()
self.arg = arg