2009-09-01 40 views
7

給定一個指向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") 

回答

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的方法名爲method。 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失敗。

+0

知道什麼 「對象協議」 是是問題。另外,由於某種原因,我正在尋找引用。謝謝。 – jmucchiello 2009-09-01 20:01:30

3

你的例子是:

PyObject* ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg"); 
+0

我知道它已經晚了7年,但是在格式arg中意味着什麼? – JMzance 2016-09-29 15:57:37

+0

它與Py_BuildValue使用的格式字符串相同:parens表示它將構建一個元組,s表示下一個參數(「An arg」)將是一個C char *字符串,轉換爲Python字符串。元組被用作函數的位置參數,所以我們傳遞一個字符串。 – 2016-09-29 23:29:13

+0

如果我想傳遞一個c數組作爲字符串列表或雙精度列表,比如'['kks','sss','www','sse']'或'[323.9,32,443, 434.8,56.6]'? – jaykumarark 2017-10-03 23:37:09

相關問題