【问题标题】:Python C API: Using the property decorator from a C extensionPython C API:使用 C 扩展中的属性装饰器
【发布时间】:2016-03-30 13:14:59
【问题描述】:

我正在用 C 语言编写一个 python 模块,它提供了一个类,包装了一个 C API。 C API 有一些基本的访问器方法,我想在 python 类中作为属性呈现。例如,假设我有:

int libspam_get_eggs(spam_t *spam, int *eggs);
int libspam_set_eggs(spam_t *spam, int eggs);

我知道如何创建一个类 CSpam 并向它添加 get_eggs() 和 set_eggs() 方法,但我想将鸡蛋作为一个属性来呈现。为了解决这个问题,我可以在对象周围放置一个 python 包装器:

class Spam(CSpam):
    eggs = property(CSpam.get_eggs, CSpam.set_eggs)

但如果可能的话,我想在 C API 中做所有事情。有没有办法做到这一点?

【问题讨论】:

    标签: python python-c-api


    【解决方案1】:

    您正在寻找 PyTypeObject.tp_getsetPyGetSetDef 结构。

    getter 和 setter 函数的签名应该匹配

    PyObject *libspam_get_eggs(PyObject *self, void *closure);
    int libspam_set_eggs(PyObject *self, PyObject *value, void *closure);
    

    其中closure 是在PyGetSetDef 上设置的void*

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2011-06-20
      • 2020-08-20
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 2016-08-18
      相关资源
      最近更新 更多