__slots__
?__slots__
行为?答案 0 :(得分:17)
创建Python类时,默认情况下它们具有__dict__
,您可以在它们上设置任何属性。插槽的要点是不创建__dict__
来节省空间。
在C接口中,它是相反的,扩展类默认没有__dict__
,而你明确地必须添加一个并添加getattr / setattr支持来处理它(尽管幸运的是有方法为此,PyObject_GenericGetAttr
和PyObject_GenericSetAttr
,所以你不必实现它们,只需使用它们。(有趣的是,没有PyObject_GenericDelAttr,但我不确定那是什么。(我应该停止像这样(或不))嵌套括号。))。
因此,扩展类型不需要插槽也没有意义。默认情况下,您只需让getattr / setatttr方法只访问该类具有的那些属性。
至于它是如何实现的,代码在typeobject.c,而这只是一个问题“如果对象有__slots__
属性,请不要创建__dict__
相当令人兴奋。:-)