Python中slots的使用

2021-08-29 15:52:57 字數 2017 閱讀 6584

預設情況下每個類都會有乙個dict,這個dict維護了例項的所有屬性,每個例項都有乙個dict,並且通過__dict__訪問。通過如下的例子來說明這個dict的使用。

class test(object):

x=9 #類變數

def __init__(self):

pass

t1=test()

t2=test()

t1.y=8 #給例項繫結乙個屬性

t2.x=5

print(t1.__dict__)

print(t2.__dict__)

執行結果為:

可以看到的是,分別為t1和t2兩個例項繫結了y和x屬性,通過__dict__訪問可以發現每個例項都有乙個dict,互不相關。而且它並不儲存類的屬性。

然而在某些情況下,我們執行前就知道了某個類需要的屬性時,這個dict就有點浪費記憶體,特別是當需要建立大量的例項時,記憶體浪費更加明顯。而在新式類中,我們可以借助__slots__解決這個問題。

__slots__中我們限制了能夠新增的屬性,並為每個空間恰好預留足夠的空間來儲存變數,如此一來,python也不再使用dict。

class test(object):

__slots__=('x')

def __init__(self):

pass

t=test()

t.x=9

print(t.x)

#t.y=0 #顯示沒有y這個屬性,除了__slots__內的其他都不能繫結

#print(t.y)

print(t.__dict__) #顯示已無__dict__屬性

在上面的例子中,我們通過__slots__限制只能新增x屬性。當試圖繫結屬性y時不能成功。事實上,除了slots內的宣告的屬性其他的都不能進行繫結。而且此時輸出dict也被告知不存在。

對於其他的類變數,被設定為readonly。

class test(object):

__slots__=('x')

y=9def __init__(self):

pass

t=test()

t.y=0

print(t.y)

執行結果為:

python是一門動態語言,除了在執行過程中修改例項的屬性之外,它還能增刪方法。在此我們就不詳說增刪方法的使用。我們再通過乙個對比的例子來加強對slots的用法的理解。

class test_slots(object):

__slots__=('x')

def __init__(self):

pass

class test(object):

def __init__(self):

pass

t_s=test_slots()

t=test()

#print(dir(test_slots)) #類結構中包含__slots__,x,y

#print(dir(test)) #類結構包含__dict__

#print(dir(t_s)) #例項結構中包含__slots__,x,y,不能任意繫結屬性

#print(dir(t)) #例項結構中包含__dict__,可任意繫結屬性

t_s.x=1

t.x=1

print("t_s.x: %d"%t_s.x)

print("t.x: %d"%t.x)

t.y=1

print("t.y: %d"%t.y)

t_s.y=1

print("t_s.y: %d"%t_s.y)

執行結果為:

同時我們要注意的是,__slots__定義的屬性只是對當前的例項起作用,對繼承的子類不起作用。如果子類中也定義了__slots__的話,子類中允許定義的屬性就是自身的__slots__加上父類的__slots__。

Python基礎 使用 slots

定義乙個特殊的slots變數,來限制該class例項能新增的屬性 示例 usr bin env python3 coding utf 8 slots class student1 object pass defruntest1 s student1 s.name 蠟筆小新 s.age 6 s.sco...

python基礎 使用 slots

正常情況下,當我們定義了乙個class,建立了乙個class的例項後,我們可以給該例項繫結任何屬性和方法,這就是動態語言的靈活性。先定義class class student object pass 然後,嘗試給例項繫結乙個屬性 s student s.name michael 動態給例項繫結乙個屬...

在Python中使用 slots

這篇文章主要介紹了在python中使用 slots 方法的詳細教程,slots 方法是python的乙個重要內建類方法,基於python2.x版本,需要的朋友可以參考下 正常情況下,當我們定義了乙個class,建立了乙個class的例項後,我們可以給該例項繫結任何屬性和方法,這就是動態語言的靈活性。...