python私有成員與公有成員(_和__)


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”這樣的特殊方式來訪問
Python中不存在嚴格意義上的私有成員。
 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM