如何在Python中实现__slots__?

时间:2011-02-20 15:10:42

标签: python python-3.x python-c-api descriptor slots

  • 如何在Python中实现__slots__
  • 这是否在[{3}}?
  • 中公开
  • 如何通过C interface在C中定义Python类时获得__slots__行为?

1 个答案:

答案 0 :(得分:17)

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

在C接口中,它是相反的,扩展类默认没有__dict__,而你明确地必须添加一个并添加getattr / setattr支持来处理它(尽管幸运的是有方法为此,PyObject_GenericGetAttrPyObject_GenericSetAttr,所以你不必实现它们,只需使用它们。(有趣的是,没有PyObject_GenericDelAttr,但我不确定那是什么。(我应该停止像这样(或不))嵌套括号。))。

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

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