2011-02-20 100 views
12
+0

能是不是隻是像在.py文件中那樣從C接口分配'__slots__'屬性? –

+0

@David Heffernan:僅在非遺留系統中使用'。 –

回答

17

創建Python類時,它們默認爲__dict__,您可以在其上設置任何屬性。插槽點不是創建__dict__來節省空間。

在C接口中,反過來,擴展類默認沒有__dict__,而且你會明確地添加一個並添加getattr/setattr支持來處理它(儘管幸運的是這些方法已經存在,PyObject_GenericGetAttrPyObject_GenericSetAttr,所以你不必實現它們,只是使用它們(有趣的是,沒有PyObject_GenericDelAttr,但我不知道那是關於什麼)(我應該停止嵌套括號這樣(或不))))。

插槽因此不需要,也不適用於擴展類型。默認情況下,您只需讓getattr/setatttr方法僅訪問類所具有的屬性。

至於它是如何實現的,該代碼是在typeobject.c,並且它幾乎只是「如果對象具有__slots__屬性,不創建__dict__的問題。很平平無奇。:-)

+0

PyObject_GenericDelAttr =具有NULL值參數的PyObject_GenericSetAttr 。 – ncoghlan

+3

呵呵,C API文檔在記錄tp_setattr和tp_setattro方法應該處理刪除的事實上真的是很懶惰,我們應該做些什麼...... – ncoghlan

+1

F或更多關於如何實現__slots__的細節,在http://code.activestate.com/recipes/532903-how-__slots__-are-implemented/中近乎相當的Python值得關注。 – joeln