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

【问题讨论】:

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

标签: python python-3.x python-c-api descriptor slots


【解决方案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 几乎等效项值得一看.
猜你喜欢
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2010-12-21
  • 2017-11-19
  • 2022-01-06
  • 1970-01-01
相关资源
最近更新 更多