Python - 私有屬性(雙下線的變形)
阿新 • • 發佈:2018-07-12
缺點 調用 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 - 私有屬性(雙下線的變形)