可以使用 PyObject_CallMethod()
函数来调用某个对象的任意方法。 形参为该对象、要调用的方法名、类似 Py_BuildValue()
所用的格式字符串以及要传给方法的参数值:
<span class="n">PyObject</span> <span class="o">*</span>
<span class="nf">PyObject_CallMethod</span><span class="p">(</span><span class="n">PyObject</span> <span class="o">*</span><span class="n">object</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">method_name</span><span class="p">,</span>
<span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">arg_format</span><span class="p">,</span> <span class="p">...);</span>
www#gaodaima.com来源gaodai$ma#com搞$代*码*网搞代码
这适用于任何具有方法的对象 —— 不论是内置方法还是用户自定义方法。 你需要负责对返回值进行最终的 Py_DECREF()
处理。
例如调用某个文件对象的 “seek” 方法并传入参数 10, 0 (假定文件对象的指针为 “f”):
<span class="n">res</span> <span class="o">=</span> <span class="n">PyObject_CallMethod</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s">"seek"</span><span class="p">,</span> <span class="s">"(ii)"</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">res</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
<span class="p">...</span> <span class="n">an</span> <span class="n">exception</span> <span class="n">occurred</span> <span class="p">...</span>
<span class="p">}</span>
<span class="k">else</span> <span class="p">{</span>
<span class="n">Py_DECREF</span><span class="p">(</span><span class="n">res</span><span class="p">);</span>
<span class="p">}</span>
请注意由于 PyObject_CallObject()
总是 接受一个元组作为参数列表,要调用不带参数的函数,则传入格式为 “()”,要调用只带一个参数的函数,则应将参数包含于圆括号中,例如 “(i)”。
来源:搞代码网:原文地址:https://www.gaodaima.com