Python嵌入C++详解(3)--Import Class

继前篇《Import Module》(http://blog.csdn.net/xiadasong007/archive/2009/09/02/4512797.aspx),继续分析嵌入部分基础知识。这次不多说,有什么问题记得多查英文资料,国内的这方面知识少

 

还是来看代码,写完我就睡觉了~

 
#include "python/python.h"
#include <iostream>
using namespace std;

 

int main(int argc,char** argv)
{
 PyObject *pModule, *pClass,*pStuObj,*pFunc;

 Py_Initialize();
 ////////////////
 //载入模块stu.py
 pModule = PyImport_ImportModule ("stu");

 

 //从模块中得到类Student
 pClass = PyObject_GetAttrString (pModule, "Student");

 

 //生成一个学生对象jack,注意3.1版本必须加上小括号:(s),否则会出错
 //PyObject_CallObject和另外一个常用的PyEval_CallObject用法极为相近,请看附录部分详解
 PyObject * temp=Py_BuildValue("(s)","jack");
 pStuObj = PyObject_CallObject(pClass, temp);

 

    //获得函数对象jack中的成员函数printName,
    //这个getattr的意思就是得到当前对象的属性(不要局限于C++中的属性哦)
  pFunc= PyObject_GetAttrString (pStuObj, "printName");

 

 //调用函数printName
  PyEval_CallObject (pFunc, NULL); 


 ////////////////
 Py_Finalize();
 return 0;
}


/*
附录:

1:Student类,我发现print后面现在必须加上小括号了,否则会有问题

 

class Student:
    name=""
    def __init__(self,name):
        self.name=name
    def printName(self):
        print (self.name)

2:PyObject_CallObject和 PyEval_CallObject不同之处:
可以看出,后者较为直接,而且接受NULL,and does explicit type checks
for args and kwds.

PyObject_CallObject(PyObject *o, PyObject *a)
{
!  PyObject *r;
!  PyObject *args = a;
!
!  if (args == NULL) {
!   args = PyTuple_New(0);
!   if (args == NULL)
!    return NULL;
!  }
!
!  r = PyEval_CallObject(o, args);
!
!  if (args != a) {
!   Py_DECREF(args);
!  }
!
!  return r;
}

PyObject_CallObject(PyObject *o, PyObject *a)
{
!  return PyEval_CallObjectWithKeywords(o, a, NULL);
}
*/

你可能感兴趣的:(C++,python,Module,null,Class,import)