您的位置:首页 > 编程语言 > C语言/C++

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

2009-09-03 00:28 756 查看
继前篇《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);
}
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: