在Python中,以下劃線開頭的變量名和方法名有特殊的含義,尤其在是在類的定義中。用下劃線作爲變量名和方法名的前綴和後綴來表示類的特殊成員。
_xxx
:這樣的對象叫做保護成員,只有類對象和子類對象能訪問這些成員。__xxx__
:系統定義的特殊成員.__xxx
:類中的私有成員,只有類對象自己能訪問,子類對象也不能訪問這個成員,但在對象的外部可以通過“對象名._類名__xxx
”這樣的特殊方式來訪問。Python中不存在嚴格意義上的私有成員。
私有屬性和私有方法
對象的某些屬性或方法可能只希望在對象的內部被使用,而不希望在外部被訪問。
格式:
在屬性名或者方法名前增加兩個下劃線
class Women:
def __init__(self,name):
self.name = name
self.__age = 20
def secret(self):
'''在對象的方法內部,可以訪問對象的私有屬性'''
print("%s的年齡是%d"%(self.name,self.__age))
def __secret1(self):
print("%s的年齡是%d"%(self.name,self.__age))
danni = Women("小美")
# 私有屬性,在外界不能被直接訪問,否則程序會報錯。
#print(danni.__age)
danni.secret()
#私有方法,同樣不允許在外界直接訪問
danni.__secret1()
父類的私有屬性和私有方法
1.子類對象不能在自己的方法內部,直接訪問父類的私有屬性或私有方法
class A:
def __init__(self):
self.num1 = 1
self.__num2 = 2
def __test(self):
print("私有方法")
class B(A):
def demo(self):
# 1.在子類的對象方法中,不能訪問父類的私有屬性
print("訪問父類的私有屬性%d" %self.num2)
# 2.在子類內部不能調用父類的私有方法
self.__test()
c = B()
c.demo()
報錯
2.子類對象可以通過父類的公有方法間接訪問到私有屬性或私有方法。
class A:
def __init__(self):
self.num1 = 1
self.__num2 = 2
def __test(self):
print("父類的私有方法")
def test(self):
'''在自己的公有方法中調用自己的私有屬性'''
print("公有方法")
print(self.__num2)
self.__test()
class B(A):
def demo(self):
# 訪問父類的公有屬性
print("子類方法%d" % self.num1)
# 調用父類法公有方式
self.test()
c = B()
c.demo()
結果:
子類方法1
公有方法
2
父類的私有方法
但是很想訪問私有成語怎麼辦???
僞私有
在名稱前面加_類名
即變成了_類名__名稱
。名稱指的是屬性或者方法
class Women:
def __init__(self,name):
self.name = name
self.__age = 20
def secret(self):
'''在對象的方法內部,可以訪問對象的私有屬性'''
print("%s的年齡是%d"%(self.name,self.__age))
def __secret1(self):
print("%s的年齡是%d"%(self.name,self.__age))
danni = Women("小美")
# 私有屬性,在外界不能被直接訪問
print(danni._Women__age)
danni.secret()
#私有方法,同樣不允許在外界直接訪問
danni._Women__secret1()
小結:
既然時私有的,也不想讓外界訪問,所以,上述的方法不建議使用。