2
#include "structmember.h"
6
PyObject *first; /* first name */
7
PyObject *last; /* last name */
12
Noddy_dealloc(Noddy* self)
14
Py_XDECREF(self->first);
15
Py_XDECREF(self->last);
16
Py_TYPE(self)->tp_free((PyObject*)self);
20
Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
24
self = (Noddy *)type->tp_alloc(type, 0);
26
self->first = PyUnicode_FromString("");
27
if (self->first == NULL) {
32
self->last = PyUnicode_FromString("");
33
if (self->last == NULL) {
41
return (PyObject *)self;
45
Noddy_init(Noddy *self, PyObject *args, PyObject *kwds)
47
PyObject *first=NULL, *last=NULL, *tmp;
49
static char *kwlist[] = {"first", "last", "number", NULL};
51
if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist,
74
static PyMemberDef Noddy_members[] = {
75
{"first", T_OBJECT_EX, offsetof(Noddy, first), 0,
77
{"last", T_OBJECT_EX, offsetof(Noddy, last), 0,
79
{"number", T_INT, offsetof(Noddy, number), 0,
85
Noddy_name(Noddy* self)
87
if (self->first == NULL) {
88
PyErr_SetString(PyExc_AttributeError, "first");
92
if (self->last == NULL) {
93
PyErr_SetString(PyExc_AttributeError, "last");
97
return PyUnicode_FromFormat("%S %S", self->first, self->last);
100
static PyMethodDef Noddy_methods[] = {
101
{"name", (PyCFunction)Noddy_name, METH_NOARGS,
102
"Return the name, combining the first and last name"
104
{NULL} /* Sentinel */
107
static PyTypeObject NoddyType = {
108
PyVarObject_HEAD_INIT(NULL, 0)
109
"noddy.Noddy", /* tp_name */
110
sizeof(Noddy), /* tp_basicsize */
112
(destructor)Noddy_dealloc, /* tp_dealloc */
118
0, /* tp_as_number */
119
0, /* tp_as_sequence */
120
0, /* tp_as_mapping */
126
0, /* tp_as_buffer */
128
Py_TPFLAGS_BASETYPE, /* tp_flags */
129
"Noddy objects", /* tp_doc */
132
0, /* tp_richcompare */
133
0, /* tp_weaklistoffset */
136
Noddy_methods, /* tp_methods */
137
Noddy_members, /* tp_members */
141
0, /* tp_descr_get */
142
0, /* tp_descr_set */
143
0, /* tp_dictoffset */
144
(initproc)Noddy_init, /* tp_init */
146
Noddy_new, /* tp_new */
149
static PyModuleDef noddy2module = {
150
PyModuleDef_HEAD_INIT,
152
"Example module that creates an extension type.",
154
NULL, NULL, NULL, NULL, NULL
162
if (PyType_Ready(&NoddyType) < 0)
165
m = PyModule_Create(&noddy2module);
169
Py_INCREF(&NoddyType);
170
PyModule_AddObject(m, "Noddy", (PyObject *)&NoddyType);