#define PY_SSIZE_T_CLEAN#include <Python.h>#include "structmember.h"typedef struct {PyObject_HEADPyObject *first; /* first name */PyObject *last; /* last name */int number;} CustomObject;static intCustom_traverse(CustomObject *self, visitproc visit, void *arg){Py_VISIT(self->first);Py_VISIT(self->last);return 0;}static intCustom_clear(CustomObject *self){Py_CLEAR(self->first);Py_CLEAR(self->last);return 0;}static voidCustom_dealloc(CustomObject *self){PyObject_GC_UnTrack(self);Custom_clear(self);Py_TYPE(self)->tp_free((PyObject *) self);}static PyObject *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);return NULL;}self->last = PyUnicode_FromString("");if (self->last == NULL) {Py_DECREF(self);return NULL;}self->number = 0;}return (PyObject *) self;}static intCustom_init(CustomObject *self, PyObject *args, PyObject *kwds){static char *kwlist[] = {"first", "last", "number", NULL};PyObject *first = NULL, *last = NULL, *tmp;if (!PyArg_ParseTupleAndKeywords(args, kwds, "|UUi", kwlist,&first, &last,&self->number))return -1;if (first) {tmp = self->first;Py_INCREF(first);self->first = first;Py_DECREF(tmp);}if (last) {tmp = self->last;Py_INCREF(last);self->last = last;Py_DECREF(tmp);}return 0;}static PyMemberDef Custom_members[] = {{"number", T_INT, offsetof(CustomObject, number), 0,"custom number"},{NULL} /* Sentinel */};static PyObject *Custom_getfirst(CustomObject *self, void *closure){Py_INCREF(self->first);return self->first;}static intCustom_setfirst(CustomObject *self, PyObject *value, void *closure){if (value == NULL) {PyErr_SetString(PyExc_TypeError, "Cannot delete the first attribute");return -1;}if (!PyUnicode_Check(value)) {PyErr_SetString(PyExc_TypeError,"The first attribute value must be a string");return -1;}Py_INCREF(value);Py_CLEAR(self->first);self->first = value;return 0;}static PyObject *Custom_getlast(CustomObject *self, void *closure){Py_INCREF(self->last);return self->last;}static intCustom_setlast(CustomObject *self, PyObject *value, void *closure){if (value == NULL) {PyErr_SetString(PyExc_TypeError, "Cannot delete the last attribute");return -1;}if (!PyUnicode_Check(value)) {PyErr_SetString(PyExc_TypeError,"The last attribute value must be a string");return -1;}Py_INCREF(value);Py_CLEAR(self->last);self->last = value;return 0;}static PyGetSetDef Custom_getsetters[] = {{"first", (getter) Custom_getfirst, (setter) Custom_setfirst,"first name", NULL},{"last", (getter) Custom_getlast, (setter) Custom_setlast,"last name", NULL},{NULL} /* Sentinel */};static PyObject *Custom_name(CustomObject *self, PyObject *Py_UNUSED(ignored)){return PyUnicode_FromFormat("%S %S", self->first, self->last);}static PyMethodDef Custom_methods[] = {{"name", (PyCFunction) Custom_name, METH_NOARGS,"Return the name, combining the first and last name"},{NULL} /* Sentinel */};static PyTypeObject CustomType = {PyVarObject_HEAD_INIT(NULL, 0).tp_name = "custom4.Custom",.tp_doc = "Custom objects",.tp_basicsize = sizeof(CustomObject),.tp_itemsize = 0,.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,.tp_new = Custom_new,.tp_init = (initproc) Custom_init,.tp_dealloc = (destructor) Custom_dealloc,.tp_traverse = (traverseproc) Custom_traverse,.tp_clear = (inquiry) Custom_clear,.tp_members = Custom_members,.tp_methods = Custom_methods,.tp_getset = Custom_getsetters,};static PyModuleDef custommodule = {PyModuleDef_HEAD_INIT,.m_name = "custom4",.m_doc = "Example module that creates an extension type.",.m_size = -1,};PyMODINIT_FUNCPyInit_custom4(void){PyObject *m;if (PyType_Ready(&CustomType) < 0)return NULL;m = PyModule_Create(&custommodule);if (m == NULL)return NULL;Py_INCREF(&CustomType);PyModule_AddObject(m, "Custom", (PyObject *) &CustomType);return m;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。