如何在Python中实现__slots__?

Mat*_*ner 12 python descriptor python-c-api slots python-3.x

Len*_*bro 17

创建Python类时,默认情况下它们有一个__dict__,您可以在它们上设置任何属性.插槽的要点是不创建__dict__节省空间.

在C接口它的其他方式,扩展类没有默认__dict__,你反而会明确需要增加一个,并添加GETATTR/SETATTR支持,以处理它(虽然幸运的是有这种方法已经,PyObject_GenericGetAttr并且PyObject_GenericSetAttr,让你不必实现它们,只需使用它们.(有趣的是,没有PyObject_GenericDelAttr,但我不确定那是什么.(我应该停止嵌套括号,如此(或不)))).

因此,扩展类型不需要插槽也没有意义.默认情况下,您只需让getattr/setatttr方法只访问该类具有的属性.

至于它是如何实现的,代码在typeobject.c中,它几乎只是一个问题"如果对象有一个__slots__属性,不要创建一个__dict__.相当令人兴奋.:-)

  • 嗯,C API文档在记录tp_setattr和tp_setattro方法也应该处理删除的事实上非常松懈.我们应该做点什么...... (3认同)
  • 有关如何实现 __slots__ 的更多详细信息,http://code.activestate.com/recipes/532903-how-__slots__-are-implemented/ 上的 Python 近乎等效内容值得查看。 (2认同)