__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_GenericGetAttr
和PyObject_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元编程之实现定制类--使用描述符,__slots__,__new__篇