在很多面向?qū)ο缶幊陶Z言中膘流,我們通常會(huì)將對(duì)象的屬性設(shè)置為私有的(private)或受保護(hù)的(protected)絮缅,簡(jiǎn)單的說就是不允許外界訪問,而對(duì)象的方法通常都是公開的(public)呼股,因?yàn)楣_的方法就是對(duì)象能夠接受的消息耕魄。在Python中,屬性和方法的訪問權(quán)限只有兩種彭谁,也就是公開的和私有的吸奴,如果希望屬性是私有的,在給屬性命名時(shí)可以用兩個(gè)下劃線作為開頭缠局。
但是则奥,Python并沒有從語法上嚴(yán)格保證私有屬性或方法的私密性,它只是給私有的屬性和方法換了一個(gè)名字來妨礙對(duì)它們的訪問狭园,事實(shí)上如果你知道更換名字的規(guī)則仍然可以訪問到它們读处,下面的代碼就可以驗(yàn)證這一點(diǎn)。之所以這樣設(shè)定唱矛,可以用這樣一句名言加以解釋罚舱,就是"We are all consenting adults here"俊戳。因?yàn)榻^大多數(shù)程序員都認(rèn)為開放比封閉要好,而且程序員要自己為自己的行為負(fù)責(zé)馆匿。
class Test:
def __init__(self, name, age):
#name為公開
self.name = name
#__age 為私有
self.__age = age
def play_game(self):
print('%s可以打游戲抑胎。'%(self.name))
def __study(self):
print('這是在__study函數(shù)下打印的')
print('#'*10)
print('年齡是:',self.__age)
test = Test('張三', 18)
test.play_game()
print(test.name)
#print(test.__age) # 報(bào)錯(cuò)AttributeError: 'Test' object has no attribute '__age'
print(test._Test__age) #可以訪問到 18
#test.__study() #AttributeError: 'Test' object has no attribute '__study'
test._Test__study() #可以訪問到
在實(shí)際開發(fā)中,我們并不建議將屬性設(shè)置為私有的渐北,因?yàn)檫@會(huì)導(dǎo)致子類無法訪問(后面會(huì)講到)阿逃。所以大多數(shù)Python程序員會(huì)遵循一種命名慣例就是讓屬性名以單下劃線開頭來表示屬性是受保護(hù)的,本類之外的代碼在訪問這樣的屬性時(shí)應(yīng)該要保持慎重赃蛛。這種做法并不是語法上的規(guī)則恃锉,單下劃線開頭的屬性和方法外界仍然是可以訪問的,所以更多的時(shí)候它是一種暗示或隱喻呕臂。