1. 程式人生 > >Python - 私有屬性(雙下線的變形)

Python - 私有屬性(雙下線的變形)

缺點 調用 rom self. from elf 類名 lock 自動

__x會自動變形為_類名__x

正常情況

class A:

    def foo(self):
        print(‘from A‘)

    def test(self):
        self.foo()


class B(A):

    def foo(self):
        print(‘from B‘)

b = B()
b.test()
# from B

把foo定義成私有

class A:

    def __foo(self):    #雙下線私有屬性在定義時就變形為_A__fa
        print(‘from A‘)

    def test(self):
        self.__foo()    #調用變形後的私有屬性對象,即_A__fa


class B(A):

    def __foo(self):
        print(‘from B‘)

b = B()
b.test()
# from A

原理:父類的__x私有屬性在定義時已經變形為_父類__x,子類可以繼承這個屬性,但無法覆蓋。所以test()裏面的self.__foo的self已經綁定了父類,子類的__foo()無法覆蓋。

class A:

    def __foo(self):    #雙下線私有屬性在定義時就變形為_A__fa
        print(‘from A‘)

    def test(self):
        self.__foo()    #調用變形後的私有屬性對象,即_A__fa


class B(A):

    def __foo(self):
        print(‘from B‘)

b = B()
b._A__foo()
# from A

Python的私有屬性的缺點

這種變形並沒有真正限制從外部直接訪問屬性

class A:

    def __foo(self):
        print(‘from A‘)

    def test(self):
        self.__foo()

a = A()
a._A__foo()

Python - 私有屬性(雙下線的變形)