1、__slots__
類屬性
__dict__
屬性跟蹤所有的實例屬性,但其會佔據大量內存。如果一個類的屬性數量較少,且不會
動態添加屬性,我們可以使用__slots__
代替__dict__
,例子:
class SlottedClass(object):
__slots__=('foo','bar')
c = SlottedClass()
c.foo = 42
c.xxx = "don't exist"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'SlottedClass' object has no attribute 'xxx'
這種特性的作用是節省內存。副作用是用戶無法隨心所欲的動態增加實例屬性。
2、特殊方法__getattribute__()
有一個名爲__getattr__()
的方法,僅當屬性不能再實例的__dict__
或他的類的__dict__
或者祖先類的__dict__
中找到時,才被調用。而__getattribute__()
的區別是,當屬性被
訪問時,它就被調用,不侷限與找不到的情況。
注意:避免在__getattribute__()
中直接或間接地調用__getattribute__()
,以免造成無
窮遞歸,爲安全地訪問它所需要的屬性,應先調用祖先類的同名方法super(obj,super).__getattribute__()