__slots__在Python中是如何实现的?

12 投票
1 回答
1803 浏览
提问于 2025-04-16 12:10
  • 在Python中,__slots__是怎么实现的?
  • 这个内容在C接口中有说明吗?
  • 如果我通过PyTypeObject在C语言中定义一个Python类,怎样才能实现__slots__的功能?

1 个回答

19

在创建Python类的时候,默认情况下它们会有一个叫做__dict__的东西,你可以在上面设置任何属性。而使用slots的目的就是不创建这个__dict__,这样可以节省空间。

在C语言的接口中,情况正好相反,扩展类默认是没有__dict__的,你需要手动添加一个,并且还要添加获取和设置属性的支持(幸运的是,已经有现成的方法可以用,叫做PyObject_GenericGetAttrPyObject_GenericSetAttr,所以你不需要自己去实现,只要使用它们就可以了。不过有趣的是,没有PyObject_GenericDelAttr这个方法,我也不太清楚这是怎么回事。(我可能应该停止这样嵌套括号了(或者不)))。

因此,slots对于扩展类型来说并不是必要的,也没有意义。默认情况下,你只需要让你的获取和设置方法访问类中已有的属性。

至于它是怎么实现的,代码在typeobject.c文件里,基本上就是一个简单的判断:“如果这个对象有__slots__属性,就不要创建__dict__。”这并没有什么特别的。:-)

撰写回答