Python學習筆記(八)—— 私有屬性、私有方法、僞私有

在Python中,以下劃線開頭的變量名和方法名有特殊的含義,尤其在是在類的定義中。用下劃線作爲變量名和方法名的前綴和後綴來表示類的特殊成員。

  1. _xxx:這樣的對象叫做保護成員,只有類對象和子類對象能訪問這些成員。
  2. __xxx__:系統定義的特殊成員.
  3. __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()

小結:
既然時私有的,也不想讓外界訪問,所以,上述的方法不建議使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章