面向對象封裝
阿新 • • 發佈:2017-12-08
有時 出名字 名稱 屬性設置 div spa pass 沒有 應該
如何進行隱藏
在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的形式訪問到.
1.類中定義的__x只能在內部使用,如self.__x,引用的就是變形的結果。
2.這種變形其實正是針對外部的變形,在外部是無法通過__x這個名字訪問到的。
3.在子類定義的__x不會覆蓋在父類定義的__x,因為子類中變形成了:_子類名__x,而父類中變形成了:_父類名__x,即雙下滑線開頭的屬性在繼承給子類時,子類是無法覆蓋的。
1.這種機制也並沒有真正意義上限制我們從外部直接訪問屬性,知道了類名和屬性名就可以拼出名字:_類名__屬性,然後就可以訪問了,如a._A__N
2.變形的過程只在類的定義是發生一次,在定義後的賦值操作,不會變形
classA: __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() a.__D=1 print(a.__dict__)
結果為:
{‘__D‘: 1, ‘_A__X ‘: 10}
同時,__可以私有方法,父類加了__,子類無法直接調用:
class A: def __init__(self): self.__X=10 #變形為self._A__X def __foo(self): #變形為_A__foo print(‘from A‘) def bar(self): self.__foo() #只有在類內部才可以通過__foo的形式訪問到. class B(A): def __init__(self): pass def __foo(self): print(‘from B‘) b=B() b.bar()
結果是:
from A
正常不私有時,會調用到b的foo函數:
class A: def __init__(self): self.__X=10 #變形為self._A__X def foo(self): #變形為_A__foo print(‘from A‘) def bar(self): self.foo() #只有在類內部才可以通過__foo的形式訪問到. class B(A): def __init__(self): pass def foo(self): print(‘from B‘) b=B() b.bar()
結果是:
from B
面向對象封裝