यह विधि दिखाती है कि C एक्सटेंशन मॉड्यूल से एक नए पायथन वर्ग को कैसे परिभाषित किया जाए। कक्षा के तरीकों को सी में लागू किया गया है, लेकिन कक्षा को अभी भी पाइथन से तत्काल, उप-वर्गीकृत और विस्तारित किया जा सकता है। विरासत के साथ एक ही तकनीक का उपयोग मौजूदा पायथन वर्ग को सी में लिखे गए तरीकों के साथ विस्तारित करने के लिए भी किया जा सकता है। इस तकनीक में, PyClass_New के पहले तर्क को NULL के रूप में पारित किया जाता है, यह दर्शाता है कि नई कक्षा में कोई आधार वर्ग नहीं है। फिर हम इस स्थान पर बेस क्लास के टपल को पास करते हैं, और हमें सामान्य पायथन इनहेरिटेंस व्यवहार मिलेगा, भले ही हमारी नई क्लास को पायथन सोर्स कोड के बजाय सी एक्सटेंशन में बनाया जा रहा हो।
उदाहरण
#include <Python.h>
static PyObject* Foo_init(PyObject *self, PyObject *args)
{
printf("Foo._ _init_ _ called\n");
Py_INCREF(Py_None);
return Py_None;
}
static PyObject* Foo_doSomething(PyObject *self, PyObject *args)
{
printf("Foo.doSomething called\n");
Py_INCREF(Py_None);
return Py_None;
}
static PyMethodDef FooMethods[] =
{
{"_ _init_ _", Foo_init, METH_VARARGS, "doc string"},
{"doSomething", Foo_doSomething, METH_VARARGS, "doc string"},
{0, 0},
};
static PyMethodDef ModuleMethods[] = { {0, 0} };
#ifdef _ _cplusplus
extern "C"
#endif
void initFoo( )
{
PyMethodDef *def;
/* create new module and class objects */
PyObject *module = Py_InitModule("Foo", ModuleMethods);
PyObject *moduleDict = PyModule_GetDict(module);
PyObject *classDict = PyDict_New( );
PyObject *className = PyString_FromString("Foo");
PyObject *fooClass = PyClass_New(NULL, classDict, className);
PyDict_SetItemString(moduleDict, "Foo", fooClass);
Py_DECREF(classDict);
Py_DECREF(className);
Py_DECREF(fooClass);
/* add methods to class */
for (def = FooMethods; def->ml_name != NULL; def++) {
PyObject *func = PyCFunction_New(def, NULL);
PyObject *method = PyMethod_New(func, NULL, fooClass);
PyDict_SetItemString(classDict, def->ml_name, method);
Py_DECREF(func);
Py_DECREF(method);
}
}