1. 程式人生 > >面向對象封裝

面向對象封裝

有時 出名字 名稱 屬性設置 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.變形的過程只在類的定義是發生一次,在定義後的賦值操作,不會變形

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() 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

  

面向對象封裝