
數據屬性
我們可以修改上節中的類並賦予一些屬性。
<code>>>> class MyClass:
... def __init__(self, arg_1, arg_2, arg_3):
... self.x = arg_1
... self._y = arg_2
... self.__z = arg_3
.../<code>
現在這個類有三個屬性:
藉助Python解包機制,可以用更緊湊的形式編寫代碼:
<code>>>> class MyClass:
... def __init __(self,arg_1,arg_2,arg_3):
... self.x,self._y,self .__ z = arg_1,arg_2,arg_3
.../<code>
屬性名稱中所有這些下劃線(_)的目的是指示“隱私”級別:
- 通常,可以從對象外部調用和修改不帶下劃線的屬性(例如.x)。
- 通常,也可以從對象外部調用和修改帶有單個下劃線的屬性(例如._y)。但是,下劃線是該類的創建者強烈建議不要使用此變量的常規標誌。應該僅通過類的功能成員(例如方法和屬性)來調用和修改它。
- 帶雙下劃線的屬性(例如.__ z)將在名為name mangling的過程中更改名稱(在本例中為._MyClass__z)。也可以使用新名稱從對象外部調用和修改它們。但是,強烈反對這種做法。還應該僅通過類的功能成員使用原始名稱來調用和修改它。
Python對象的數據屬性通常存儲在名為.__ dict__的字典中,這也是對象的屬性。但是,可以將數據存儲在其他位置。我們可以通過直接調用.__ dict__或使用Python內置函數vars()來獲取它。
<code>>>> a = MyClass(2,4,8)
>>> vars(a)
{'x':2,'_y':4,'_MyClass__z':8}
>>> a .__ dict__
{'x': 2,'_y':4,4,'_MyClass__z':8}/<code>
由於名稱修改,鍵“ _MyClass__z”在那裡,而不是“ __z”。
我們可以將.__ dict__用作任何其他Python字典。
這是獲取和更改與數據屬性關聯的值的常規方法:
<code>>>> a.x
2
>>> a._y
4
>>> a.__z
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'MyClass' object has no attribute '__z'
>>> a.x = 16
>>> a.x
16
>>> vars(a)
{'x': 16, '_y': 4, '_MyClass__z': 8}/<module>/<stdin>/<code>
請注意,我們無法訪問a .__ z,因為.__ dict__沒有key __z。
閱讀更多 極客24h 的文章