【问题标题】:Accessing Python slots based object members in C在 C 中访问基于 Python 插槽的对象成员
【发布时间】:2015-11-26 22:24:11
【问题描述】:

我有一个基于插槽的 Python 类来节省空间

class my_class(object):

    __slots__ = ('x', 'y')

    def __init__(self, x, y):
        self.x = x
        self.y = y

我需要从 C 函数访问此类的对象。 当我打印时

obj->ob_type->tp_name

在 C 中,我看到了 my_class,但找不到访问实例上成员值的方法。

【问题讨论】:

  • 您在寻找什么样的访问权限?您需要知道插槽的名称(自省)还是知道有xy 属性并且只需要访问它们?
  • 我知道他们的名字。只需要访问这些值。
  • 我刚才可以使用 PyObject_GetAttrString(obj, "x") 访问它们。这是首选方法还是有更快的方法?
  • 这是首选方法。它们只是属性,实际上是作为类上的描述符实现的,访问实例内存空间中的值。

标签: python python-c-api slots


【解决方案1】:

对于__slots__ 中的每个名称,Python 都会在类上生成一个描述符对象(存储在PyTypeObject.tp_members struct 中)。每个描述符存储一个偏移量,就像__dict__ attribute is stored as an offset

如果您已经知道插槽的名称并且只想访问每个实例上的值,只需使用普通的PyObject_GetAttrString() function 将其留给 C-API 来为您访问插槽。

【讨论】:

    猜你喜欢
    • 2011-11-21
    • 2019-07-08
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多