在 Python 中,我們?cè)诙x類的時(shí)候可以定義屬性和方法。當(dāng)我們創(chuàng)建了一個(gè)類的實(shí)例后,我們還可以給該實(shí)例綁定任意新的屬性和方法。
看下面一個(gè)簡單的例子:
class Point(object):
def __init__(self, x=0, y=0):
self.x = x
self.y = y
>>> p = Point(3, 4)
>>> p.z = 5 # 綁定了一個(gè)新的屬性
>>> p.z
5
>>> p.__dict__
{'x': 3, 'y': 4, 'z': 5}
在上面,我們創(chuàng)建了實(shí)例 p 之后,給它綁定了一個(gè)新的屬性 z,這種動(dòng)態(tài)綁定的功能雖然很有用,但它的代價(jià)是消耗了更多的內(nèi)存。
因此,為了不浪費(fèi)內(nèi)存,可以使用 __slots__
來告訴 Python 只給一個(gè)固定集合的屬性分配空間,對(duì)上面的代碼做一點(diǎn)改進(jìn),如下:
class Point(object):
__slots__ = ('x', 'y') # 只允許使用 x 和 y
def __init__(self, x=0, y=0):
self.x = x
self.y = y
上面,我們給 __slots__
設(shè)置了一個(gè)元組,來限制類能添加的屬性?,F(xiàn)在,如果我們想綁定一個(gè)新的屬性,比如 z,就會(huì)出錯(cuò)了,如下:
>>> p = Point(3, 4)
>>> p.z = 5
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-648-625ed954d865> in <module>()
----> 1 p.z = 5
AttributeError: 'Point' object has no attribute 'z'
使用 __slots__
有一點(diǎn)需要注意的是,__slots__
設(shè)置的屬性僅對(duì)當(dāng)前類有效,對(duì)繼承的子類不起效,除非子類也定義了 __slots__
,這樣,子類允許定義的屬性就是自身的 slots 加上父類的 slots。
__slots__
設(shè)置的屬性僅對(duì)當(dāng)前類有效,對(duì)繼承的子類不起效,除非子類也定義了 slots,這樣,子類允許定義的屬性就是自身的 slots 加上父類的 slots。