在对象上调用方法
假设你有一个指向 Python 对象的 PyObject*,那么你该如何调用这个对象的方法呢?文档里从来没有给出过这样的例子:
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 个回答
3
你的例子可以是:
PyObject* ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg");
9
PyObject* obj = ....
PyObject *ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg");
if (!ret) {
// check error...
}
先去看看Python C API 的文档。在这里,你需要关注对象协议。
PyObject* PyObject_CallMethod(PyObject *o, char *method, char *format, ...)
返回值:新的引用。
调用对象 o 的方法,方法名为 method,可以传入不同数量的 C 语言参数。这些 C 参数是通过一个
Py_BuildValue()
格式字符串来描述的,这个格式字符串应该能生成一个元组。如果格式是NULL
,那就表示没有提供参数。成功时返回调用的结果,失败时返回NULL
。这相当于 Python 中的表达式o.method(args)
。需要注意的是,如果你只传PyObject * args
,那么PyObject_CallMethodObjArgs()
是一个更快的选择。
还有
PyObject* PyObject_CallMethodObjArgs(PyObject *o, PyObject *name, ..., NULL)
返回值:新的引用。
调用对象
o
的一个方法,方法名是以 Python 字符串对象的形式给出的,存储在 name 中。这个方法可以接受不同数量的PyObject*
参数。参数是以可变数量的参数形式提供,最后以NULL
结束。成功时返回调用的结果,失败时返回NULL
。