__slots__在Python中是如何实现的?
- 在Python中,
__slots__
是怎么实现的? - 这个内容在C接口中有说明吗?
- 如果我通过
PyTypeObject
在C语言中定义一个Python类,怎样才能实现__slots__
的功能?
1 个回答
19
在创建Python类的时候,默认情况下它们会有一个叫做__dict__
的东西,你可以在上面设置任何属性。而使用slots的目的就是不创建这个__dict__
,这样可以节省空间。
在C语言的接口中,情况正好相反,扩展类默认是没有__dict__
的,你需要手动添加一个,并且还要添加获取和设置属性的支持(幸运的是,已经有现成的方法可以用,叫做PyObject_GenericGetAttr
和PyObject_GenericSetAttr
,所以你不需要自己去实现,只要使用它们就可以了。不过有趣的是,没有PyObject_GenericDelAttr
这个方法,我也不太清楚这是怎么回事。(我可能应该停止这样嵌套括号了(或者不)))。
因此,slots对于扩展类型来说并不是必要的,也没有意义。默认情况下,你只需要让你的获取和设置方法访问类中已有的属性。
至于它是怎么实现的,代码在typeobject.c文件里,基本上就是一个简单的判断:“如果这个对象有__slots__
属性,就不要创建__dict__
。”这并没有什么特别的。:-)