Python中私有權(quán)限是指僅在類(lèi)的內(nèi)部可訪(fǎng)問(wèn)的屬性和方法。在Python中,我們可以通過(guò)在屬性或方法的名稱(chēng)前添加兩個(gè)下劃線(xiàn)來(lái)將其設(shè)置為私有屬性或方法。
class Person: def __init__(self, name, age): self.__name = name self.__age = age def __displayAge(self): print("Age:", self.__age) p = Person("Bob", 25) print(p.__name) # 這里會(huì)報(bào)錯(cuò),因?yàn)開(kāi)_name屬性是私有屬性,外部不可訪(fǎng)問(wèn) p.__displayAge() # 這里也會(huì)報(bào)錯(cuò),因?yàn)開(kāi)_displayAge方法同樣是私有方法,外部無(wú)法調(diào)用
可以看到,當(dāng)試圖在類(lèi)的外部訪(fǎng)問(wèn)私有屬性或方法時(shí),會(huì)引發(fā)AttributeError異常。
但是,Python中并不存在真正的私有權(quán)限,這是因?yàn)樵赑ython中無(wú)論是私有屬性還是方法,其實(shí)都可以在類(lèi)的外部直接訪(fǎng)問(wèn)。只是Python解釋器將其名稱(chēng)進(jìn)行了一定的變換,以避免名稱(chēng)沖突。實(shí)際訪(fǎng)問(wèn)私有屬性或方法的方式是在其名稱(chēng)前加上類(lèi)名稱(chēng)和一個(gè)下劃線(xiàn),如下所示:
print(p._Person__name) # 這樣就可以訪(fǎng)問(wèn)類(lèi)中的__name屬性了 p._Person__displayAge() # 這樣也可以調(diào)用類(lèi)中的__displayAge方法
需要注意的是,雖然可以通過(guò)這種方式訪(fǎng)問(wèn)私有屬性或方法,但不建議在外部直接這樣做。因?yàn)樗接袑傩院头椒ㄊ菫榱嗽陬?lèi)的內(nèi)部進(jìn)行封裝和保護(hù)而設(shè)計(jì)的,直接在外部訪(fǎng)問(wèn)可能會(huì)破壞封裝性,引起不必要的風(fēng)險(xiǎn)和錯(cuò)誤。