python並沒有對私有成員提供嚴格的訪問保護機制。
- 在定義類的成員時,如果成員名以兩個下划線“__”或更多下划線開頭而不以兩個或更多下划線結束則表示是私有成員。
- 私有成員在類的外部不能直接訪問,需要通過調用對象的公開成員方法來訪問,也可以通過Python支持的特殊方式來訪問。
1 class A: 2 def __init__(self, value1 = 0, value2 = 0): 3 self._value1 = value1 4 self.__value2 = value2 5 def setValue(self, value1, value2): 6 self._value1 = value1 7 self.__value2 = value2 8 def show(self): 9 print(self._value1) 10 print(self.__value2) 11 12 >>> a = A() 13 >>> a._value1 14 0 15 >>> a._A__value2 # 在外部訪問對象的私有數據成員 16 0
在Python中,以下划線開頭的變量名和方法名有特殊的含義,尤其是在類的定義中。
- _xxx:受保護成員,不能用"from module import *"導入
- __xxx__:系統定義的特殊成員
- __xxx:私有成員,只有類對象自己能訪問,子類對象不能直接訪問到這個成員,但在對象外部可以通過“對象名._類名__xxx”這樣的特殊方式來訪問
1 class Fruit: 2 def __init__(self): 3 self.__color = 'Red' 4 self.price = 1 5 >>> apple = Fruit() 6 >>> apple.price # 顯示對象公開數據成員的值 7 1 8 >>> print(apple.price, apple._Fruit__color) # 顯示對象私有數據成員的值 9 1 Red 10 >>> apple.price = 2 # 修改對象公開數據成員的值 11 >>> apple._Fruit__color = "Blue" # 修改對象私有數據成員的值 12 >>> print(apple.price, apple._Fruit__color) 13 2 Blue 14 >>> print(apple.__color) # 不能直接訪問對象的私有數據成員,出錯 15 AttributeError:Fruit instance has no attribute '__color'
在程序中,可以使用一個下划線“_”來表示不關心該變量的值。
1 for _ in range(5): 2 print(3, end=' ') # 此處的3可以為任意值,輸出結果為重復5次的值。若改為print(_, end=' ');>>>0 1 2 3 4 3 3 3 3 3 3 4 >>> a, _ = divmod(60, 18) # 只關心整商,不關心余數。 5 >>> a # 即等價於a = 60//18 6 3