符合Python風格的對象

 

私有屬性的設置

Python的私有屬性和受保護的屬性:python

  若是有人編寫了Dog類,這個類內部用到了mood實例屬性,可是沒有將其開放。spa

  如今,你建立了Dog類的子類:Beagle。對象

  若是你在絕不知情的狀況下又建立了名爲mood的實例屬性,那麼在繼承的方法中就會把Dog類的mood屬性覆蓋掉。blog

 

名稱改寫:繼承

  爲了不這個狀況,若是以__mood的形式命名實例屬性,Python會把屬性存入實例的__dict__屬性中,並且會在前面加上一個下劃線和類名。內存

  所以,對Dog類來講,__mood會變成_Dog__mood;對Beagle來講,會變成_Beagle__mood。這個特性就是名稱改寫。字符串

約定俗成:class

  對於不喜歡使用名稱改寫的人,他們約定使用一個下劃線前綴編寫的「受保護」的屬性。(如:_MyThing_blahblah)引用

  相似於使用全大寫字母表示一個常量。方法

__slots__類屬性節省空間:

  默認狀況下,Python在各個實例中名爲__dict__的字典裏存儲實例屬性,字典會消耗大量內存。

  繼承自父類的__slots__屬性沒有效果。

  Python只會使用各個類當前類中定義的__slots__屬性。

  建立一個類屬性__slots__,把它的值設爲一個字符串構成的可迭代對象其中各個元素表示各個實例屬性。

class Vector:

    __slots__ = ('__x','__y')

  在類中定義了__slots__屬性以後,實例不能再有__slots__中所列名稱以外的其餘屬性。

  若是類中定義了__slots__屬性,並且想把實例做爲弱引用的目標,要把 '__weakref__' 添加到__slots__中。

  實例只能擁有__slots__屬性,除非把 "__dict__" 加入到__slots__中後,會支持動態建立屬性。

覆蓋類屬性:

  類屬性可用於爲實例屬性提供默認值。

  若是爲不存在的實例屬性賦值,會新建實例屬性

  若是想修改類屬性的值,必須直接在類上修改,不能經過實例修改。

  若是想修改全部實例的XX屬性的默認值,能夠經過 類.XX 修改

相關文章
相關標籤/搜索