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 修改