__slots__ 在 Python 中是如何实现的?

Posted

技术标签:

【中文标题】__slots__ 在 Python 中是如何实现的?【英文标题】:How is __slots__ implemented in Python? 【发布时间】:2011-06-30 18:43:37 【问题描述】: __slots__ 在 Python 中是如何实现的? 这是否暴露在C interface中? 通过PyTypeObject 在 C 中定义 Python 类时如何获得 __slots__ 行为?

【问题讨论】:

您不能像在 .py 文件中那样从 C 接口分配 __slots__ 属性吗? @David Heffernan:仅在非旧系统上;) 【参考方案1】:

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

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

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

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

【讨论】:

PyObject_GenericDelAttr = PyObject_GenericSetAttr 带有 NULL 值参数。 嗯,C API 文档在记录 tp_setattr 和 tp_setattro 方法也应该处理删除这一事实方面确实很懈怠。我们或许应该为此做点什么…… 有关如何实现 slots 的更多详细信息,code.activestate.com/recipes/532903-how-slots-are-implemented/ 处的 Python 几乎等效项值得一看.

以上是关于__slots__ 在 Python 中是如何实现的?的主要内容,如果未能解决你的问题,请参考以下文章

python定制类

python元编程之实现定制类--使用描述符,__slots__,__new__篇

python进阶五(定制类)5-7 python中__slots__

python 的定制类

如何使用 `__slots__` 初始化属性?

python限定类属性的类属性:__slots__