一.__slots__屬性有什麼做用?爲何要有__slots__屬性。數組
首先來講一說__slots__是什麼,__slots__是一個類變量,它裏面的值能夠是字符串,能夠是列表,能夠是元組。(若是__slots__這個屬性的值爲一個字符串,那麼意爲着這個類生成的對象,只能有一個屬性)。
數據結構
那麼爲何要用__slots__屬性呢?ide
關於這個問題還要從每一個對象的__dict__屬性開始提及。工具
當使用.點來訪問屬性本質就是在訪問類或者對象的__dict__屬性字典(類的字典是共享的,而每一個實例的是獨立的),若是一個類,生成了不少的對象,每生成一個對象時,都會爲這個對象生成一個__dict__屬性字典,若是有不少類就會生成不少的字典,會佔用不少的內存空間。優化
若是你有一個屬性不多的類,可是有不少實例,爲了節省內存可使用__slots__取代實例的__dict__啦~對象
當你定義__slots__後,__slots__就會爲實例使用一種更加緊湊的內部表示。實例經過一個很小的固定大小的數組來構建,而不是爲每一個實例定義一個字典。繼承
這跟元組或列表很相似。在__slots__中列出的屬性名在內部被映射到這個數組的指定小標上。內存
!!使用__slots__的一個缺點就是咱們不能再給實例添加新的屬性了,只能使用在__slots__中定義的那些屬性名。這點是很是值得注意的!!ci
二.關於使用__slots__屬性的主意事項。字符串
使用__slots__屬性後,沒法在給對象添加新的屬性!只能使用在類中__slots__屬性中定義的屬性名!!!
定義了__slots__屬性後的類,將再也不具有普通類的一些特性,好比:多繼承。大多數狀況下,你應該明確,某些在程序中會建立幾百萬個對象的類,就須要使用__slots__屬性,而且只在那些常常被使用到 的用做數據結構的類上定義__slots__。
三.關於__slots__的一些補充。
關於__slots__的一個常見誤區是它能夠做爲一個封裝工具來防止用戶給實例增長新的屬性。儘管使用__slots__能夠達到這樣的目的,可是這個並非它的初衷。 更多的是用來做爲一個內存優化工具。
四.關於__slots__的使用方法演示。
例1:
class Foo:
__slots__='x'
f1=Foo()
f1.x=1
f1.y=2#報錯
print(f1.__slots__) #f1再也不有__dict__
class Bar:
__slots__=['x','y']
n=Bar()
n.x,n.y=1,2
n.z=3#報錯
例2:(__slots__特性的驗證)
class Foo:
__slots__=['name','age']
f1=Foo()
f1.name='alex'
f1.age=18
print(f1.__slots__)
f2=Foo()
f2.name='egon'
f2.age=19
print(f2.__slots__)
print(Foo.__dict__)
#f1與f2都沒有屬性字典__dict__了,統一歸__slots__管,節省內存