Python使用C或C扩展类,快速了

白癜风治疗多少钱 https://m.39.net/pf/a_4975799.html

Python使用C/C++扩展类模块和之前所讲的模块差不多,多了一些流程,比如:编写类的构造函数、析构函数、成员属性、成员方法、以及成员属性和方法绑定。

使用C/C++扩展Python,实现Python模块扩展或嵌入Python解释器

随着扩展的模块越来越复杂,不得不了解Python中的引用计数规则,更加规范的管理内存使用,防止内存泄露。

如下是两个流程,由简入繁的了解类模块开发的整个流程。

扩展开发流程,小试牛刀

编辑切换为居中

添加图片注释,不超过字(可选)

编写C/C++代码

//custom.cpp#includePython.htypedefstruct{PyObject_HEAD}CustomObject;staticPyTypeObjectCustomType={PyVarObject_HEAD_INIT(NULL,0).tp_name=custom.Custom,.tp_doc=Customobjects,.tp_basicsize=sizeof(CustomObject),.tp_itemsize=0,.tp_flags=Py_TPFLAGS_DEFAULT,.tp_new=PyType_GenericNew,};staticPyModuleDefcustommodule={PyModuleDef_HEAD_INIT,.m_name=custom,.m_doc=examplemodulethatcreatesanextensiontype.,.m_size=-1,};PyMODINIT_FUNCPyInit_custom(void){PyObject*m;if(PyType_Ready(CustomType)0)returnNULL;m=PyModule_Create(custommodule);if(m==NULL)returnNULL;Py_INCREF(CustomType);if(PyModule_AddObject(m,Custom,(PyObject*)CustomType)0){Py_DECREF(CustomType);Py_DECREF(m);returnNULL;}returnm;}编写setup.py安装程序

编写setup.py之后执行pythonsetup.pyinstall,编译模块十分的方便,可以将我们的动态链接库快速导入到系统模块中,方便我们导入自己的模块。

#setup.pyfromdistutils.coreimportsetup,Extensionsetup(name=custom,version=1.0,ext_modules=[Extension(custom,[custom.cpp])])执行安装测试

调用模块,以及初始化对象

pythonsetup.pyinstallimportcustomprint(custom.Custom())custom.Customobjectat0x7fd50深入理解,成员属性成员方法注册

类的成员属性和方法定义及绑定流程

编辑切换为居中

#includePython.h#includestructmember.htypedefstruct{PyObject_HEADPyObject*first;/*firstname*/PyObject*last;/*lastname*/intnumber;}CustomObject;//定义新的结构体,Python中的类//Custom_new初始化函数staticPyObject*Custom_new(PyTypeObject*type,PyObject*args,PyObject*kwds){CustomObject*self;self=(CustomObject*)type-tp_alloc(type,0);if(self!=NULL){self-first=PyUnicode_FromString();if(self-first==NULL){Py_DECREF(self);returnNULL;}self-last=PyUnicode_FromString();if(self-last==NULL){Py_DECREF(self);returnNULL;}self-number=0;}return(PyObject*)self;}//Custom_dealloc析构函数,释放对象staticvoidCustom_dealloc(CustomObject*self){Py_XDECREF(self-first);//释放成员firstPy_XDECREF(self-last);//释放成员lastPy_TYPE(self)-tp_free((PyObject*)self);//释放结构体CustomObject}//Custom_init对象初始化cs=custom.Custom()staticintCustom_init(CustomObject*self,PyObject*args,PyObject*kwds){//定义参数staticchar*kwlist[]={first,last,number,NULL};PyObject*first=NULL,*last=NULL,*tmp;//参数绑定if(!PyArg_ParseTupleAndKeywords(args,kwds,

OOi,kwlist,first,last,self-number))return-1;//参数赋值绑定if(first){tmp=self-first;Py_INCREF(first);//引用计数器累加self-first=first;Py_XDECREF(tmp);}if(last){tmp=self-last;Py_INCREF(last);//引用计数器累加self-last=last;Py_XDECREF(tmp);}return0;}//定义成员属性;CustomObject的成员属性staticPyMemberDefCustom_members[]={{first,T_OBJECT_EX,offsetof(CustomObject,first),0,firstname},{last,T_OBJECT_EX,offsetof(CustomObject,last),0,lastname},{number,T_INT,offsetof(CustomObject,number),0,customnumber},{NULL}/*Sentinel*/};//Custom_name定义方法staticPyObject*Custom_name(CustomObject*self,PyObject*Py_UNUSED(ignored)){if(self-first==NULL){PyErr_SetString(PyExc_AttributeError,first);returnNULL;}if(self-last==NULL){PyErr_SetString(PyExc_AttributeError,last);returnNULL;}returnPyUnicode_FromFormat(%S%S,self-first,self-last);}//Custom_methods定义类的方法,并绑定Custom_namestaticPyMethodDefCustom_methods[]={{name,(PyCFunction)Custom_name,METH_NOARGS,Returnthename,


转载请注明:http://www.aierlanlan.com/rzfs/6750.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了