定義:
顧名思義就是隱藏類及對象的屬性,通過__兩個下划線定義的屬性則為隱藏屬性,但是這種隱藏也只是語法上的隱藏,可以通過__dict__來進行查看,然后進行調用,聲明的隱藏屬性都會在聲明時進行轉化
事例:
#先看如何隱藏 class Foo: __N=111111 #_Foo__N 聲明的隱藏屬性 def __init__(self,name): self.__Name=name #self._Foo__Name=name def __f1(self): #_Foo__f1 print('f1') def f2(self): self.__f1() #self._Foo__f1() f=Foo('egon')#這種是調不到的 print(f.__N) f.__f1()#這種是調不到的 f.__Name f.f2()
注意:
#1:這種隱藏只是一種語法上變形操作,並不會將屬性真正隱藏起來 print(Foo.__dict__) print(f.__dict__) print(f._Foo__Name) print(f._Foo__N) #2:這種語法級別的變形,是在類定義階段發生的,並且只在類定義階段發生 Foo.__x=123123123123123123123123123123123123123123 print(Foo.__dict__) print(Foo.__x) f.__x=123123123 print(f.__dict__) print(f.__x) #3:在子類定義的__x不會覆蓋在父類定義的__x,因為子類中變形成了:_子類名__x,而父類中變形成了:_父類名__x,即雙下滑線開頭的屬性在繼承給子類時,子類是無法覆蓋的。 class Foo: def __f1(self): #_Foo__f1 print('Foo.f1') def f2(self): self.__f1() #self._Foo_f1 class Bar(Foo): def __f1(self): #_Bar__f1 print('Bar.f1') b=Bar() b.f2()