在对象上调用方法

jmu*_*llo 7 c python embedded-language

给定PyObject*指向python对象,如何调用其中一个对象方法?文档从未举例说明:

PyObject* obj = ....
PyObject* args = Py_BuildValue("(s)", "An arg");
PyObject* method = PyWHATGOESHERE(obj, "foo");
PyObject* ret = PyWHATGOESHERE(obj, method, args);
if (!ret) {
   // check error...
}
Run Code Online (Sandbox Code Playgroud)

这相当于

>>> ret = obj.foo("An arg")
Run Code Online (Sandbox Code Playgroud)

Joh*_*kin 7

PyObject* obj = ....
PyObject *ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg");
if (!ret) {
   // check error...
}
Run Code Online (Sandbox Code Playgroud)

阅读Python C API文档.在这种情况下,您需要对象协议.

PyObject* PyObject_CallMethod(PyObject *o, char *method, char *format, ...)
Run Code Online (Sandbox Code Playgroud)

返回值:新参考.

使用可变数量的C参数调用对象o的方法.C参数由Py_BuildValue()应该生成元组的格式字符串描述.格式可以是NULL,表示没有提供参数.返回成功或NULL失败时调用的结果.这相当于Python表达式o.method(args).请注意,如果您只是通过PyObject * args, PyObject_CallMethodObjArgs()则是更快的替代方案.

PyObject* PyObject_CallMethodObjArgs(PyObject *o, PyObject *name, ..., NULL)
Run Code Online (Sandbox Code Playgroud)

返回值:新参考.

调用对象的方法o,其中方法的名称作为名称中的Python字符串对象给出.它使用可变数量的 PyObject*参数调用.参数作为可变数量的参数提供,后跟NULL.返回成功或NULL失败时调用的结果 .