預設情況下每個類都會有乙個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的例項後,我們可以給該例項繫結任何屬性和方法,這就是動態語言的靈活性。...