如果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...
}
这相当于
>>> ret = obj.foo("An arg")
答案 0 :(得分:7)
PyObject* obj = ....
PyObject *ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg");
if (!ret) {
// check error...
}
阅读Python C API documentation。在这种情况下,您需要object protocol。
PyObject* PyObject_CallMethod(PyObject *o, char *method, char *format, ...)
返回值:新参考。
使用可变数量C调用对象o的方法 参数。 C参数是 以
Py_BuildValue()
格式描述 应该产生元组的字符串。 格式可以是NULL
,表示 没有提供任何参数。 返回调用的结果 成功,或NULL
失败。这是 相当于Python 表达o.method(args)
。注意 如果你只通过PyObject * args
,PyObject_CallMethodObjArgs()
是一个 更快的替代方案。
和
PyObject* PyObject_CallMethodObjArgs(PyObject *o, PyObject *name, ..., NULL)
返回值:新参考。
调用对象
o
的方法,其中给出了方法的名称 作为名称中的Python字符串对象。它 调用可变数量的PyObject*
个论点。争论是 作为可变数量的 参数后跟NULL
。返回 成功召唤的结果,或NULL
失败。
答案 1 :(得分:3)
你的例子是:
PyObject* ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg");