面向對象的私有與公有
對於每一個類的成員而言都有兩種形式:
公有成員,在任何地方都能訪問
私有成員,只有在類的內部才能方法
私有成員和公有成員的訪問限制不同:
靜態字段(靜態變量)
公有靜態字段:類可以訪問;類內部可以訪問;派生類中可以訪問
私有靜態字段:僅類內部可以訪問;
公有靜態字段
class A: name = "公有靜態字段" def func(self): print(A.name) class B(A): def show(self): print(A.name) print(A.name) #類訪問 obj = A() obj.func() #類內部可訪問 obj_son = B() obj_son.show() #派生類中可訪問
私有靜態字段
class A: __name = "私有靜態字段" def func(self): print(A.__name) class B(A): def show(self): print(A.__name) obj = A() obj_2 = B() #print(obj.__name) #在外部訪問報錯 obj.func() #類內部可以訪問 obj_2.show() #不可在派生類中訪問 AttributeError: type object 'A' has no attribute '_B__name'
普通字段(對象屬性)
公有普通字段:對象可以訪問;類內部可以訪問;派生類中可以訪問
私有普通字段:僅類內部可以訪問;
公有普通字段
class A: def __init__(self): self.foo = "公有字段" def func(self): print(self.foo) class B(A): def show(self): print(self.foo) obj = A() print(obj.foo) obj.func() obj_2 = B() obj_2.show()
私有普通字段
class A: def __init__(self): self.__foo = "私有字段" def func(self): print(self.__foo) class B(A): def show(self): print(self.__foo) obj = A() # print(obj.__foo) #外部訪問報錯 obj.func() #類內部訪問 # obj_2 = B() # obj_2.show() #派生類中訪問報錯
方法
公有方法:對象可以訪問;類內部可以訪問;派生類中可以訪問
私有方法:僅類內部可以訪問;
公有方法
class A: def __init__(self): pass def add(self): print('A') class B(A): def show(self): print("B") def func(self): self.show() obj = B() obj.show() obj.func() obj.add()
私有方法
class A: def __init__(self): pass def __add(self): print('A') class B(A): def __show(self): print("B") def func(self): self.__show() obj = B() obj.__show() #不能訪問 obj.func() #能訪問 obj.__add() #不能訪問
總結:
對於這些私有成員來說,他們只能在類的內部使用,不能再類的外部以及派生類中使用.
非要訪問私有成員的話,可以通過 對象._類__屬性名,但是絕對不允許!!!
為什么可以通過._類__私有成員名訪問呢?因為類在創建時,如果遇到了私有成員(包括私有靜態字段,私有普通字段,私有方法)它會將其保存在內存時自動在前面加上_類名.