本文實例講述了Python封裝原理與實現方法。分享給大家供大家參考,具體如下:
【封裝】
隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。
【好處】
1. 將變化隔離;
2. 便于使用;
3. 提高復用性;
4. 提高安全性;
【封裝原則】
1. 將不需要對外提供的內容都隱藏起來;
2. 把屬性都隱藏,提供公共方法對其訪問。
私有變量和私有方法
在python中用雙下劃線開頭的方式將屬性隱藏起來(設置成私有的)
私有變量
#其實這僅僅這是一種變形操作#類中所有雙下劃線開頭的名稱如__x都會自動變形成:_類名__x的形式:class A: __N=0 #類的數據屬性就應該是共享的,但是語法上是可以把類的數據屬性設置成私有的如__N,會變形為_A__N def __init__(self): self.__X=10 #變形為self._A__X def __foo(self): #變形為_A__foo print('from A') def bar(self): self.__foo() #只有在類內部才可以通過__foo的形式訪問到.#A._A__N是可以訪問到的,即這種操作并不是嚴格意義上的限制外部訪問,僅僅只是一種語法意義上的變形
這種自動變形的特點:
1.類中定義的__x
只能在內部使用,如self.__x
,引用的就是變形的結果。
2.這種變形其實正是針對外部的變形,在外部是無法通過__x
這個名字訪問到的。
3.在子類定義的__x
不會覆蓋在父類定義的__x
,因為子類中變形成了:_子類名__x,而父類中變形成了:_父類名__x,即雙下滑線開頭的屬性在繼承給子類時,子類是無法覆蓋的。
這種變形需要注意的問題是:
1.這種機制也并沒有真正意義上限制我們從外部直接訪問屬性,知道了類名和屬性名就可以拼出名字:_類名__屬性,然后就可以訪問了,如a._A__N
2.變形的過程只在類的定義是發生一次,在定義后的賦值操作,不會變形
私有方法
#正常情況>>> class A:... def fa(self):... print('from A')... def test(self):... self.fa()...>>> class B(A):... def fa(self):... print('from B')...>>> b=B()>>> b.test()from B
#把fa定義成私有的,即__fa>>> class A:... def __fa(self): #在定義時就變形為_A__fa... print('from A')... def test(self):... self.__fa() #只會與自己所在的類為準,即調用_A__fa...>>> class B(A):... def __fa(self):... print('from B')...>>> b=B()>>> b.test()from A
新聞熱點
疑難解答