12
  • __slots__在 Python 中是如何实现的?
  • 这是否暴露在C 接口中?
  • __slots__在 C via 中定义 Python 类时如何获得行为PyTypeObject
4

1 回答 1

18

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

在 C 接口中则相反,默认情况下扩展类具有 no __dict__,而您将改为显式添加一个并添加 getattr/setattr 支持来处理它(尽管幸运的是已经有方法,PyObject_GenericGetAttr并且PyObject_GenericSetAttr,所以你不必实现它们,只需使用它们。(有趣的是,没有 PyObject_GenericDelAttr,但我不确定那是什么。(我可能应该停止像这样(或不)嵌套括号))。

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

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

于 2011-02-20T16:29:27.620 回答