Python C API:使用来自 C 扩展的 属性 装饰器
Python C API: Using the property decorator from a C extension
我正在用 C 编写一个 python 模块,它提供一个 class,包装一个 C API。 C API 有一些基本的访问器方法,我想在 python class 中以 属性 的形式呈现。例如,假设我有:
int libspam_get_eggs(spam_t *spam, int *eggs);
int libspam_set_eggs(spam_t *spam, int eggs);
我知道如何创建 class 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);
其中 closure
是在 PyGetSetDef
上设置的 void*
。
我正在用 C 编写一个 python 模块,它提供一个 class,包装一个 C API。 C API 有一些基本的访问器方法,我想在 python class 中以 属性 的形式呈现。例如,假设我有:
int libspam_get_eggs(spam_t *spam, int *eggs);
int libspam_set_eggs(spam_t *spam, int eggs);
我知道如何创建 class 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);
其中 closure
是在 PyGetSetDef
上设置的 void*
。