在对象上调用方法

时间:2009-09-01 19:08:34

标签: python c 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...
}

这相当于

>>> ret = obj.foo("An arg")

2 个答案:

答案 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");