编程语言
首页 > 编程语言> > Python C API:使用C扩展中的属性装饰器

Python C API:使用C扩展中的属性装饰器

作者:互联网

我正在用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中做所有事情.有没有办法做到这一点?

解决方法:

您正在寻找PyTypeObject.tp_getset和PyGetSetDef结构.

getter和setter函数的签名应匹配

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

闭包是在PyGetSetDef上设置的void *.

标签:python-c-api,python
来源: https://codeday.me/bug/20191118/2031478.html