यह मेथड दिखाता है कि C एक्सटेंशन मॉड्यूल से एक नई पायथन क्लास कैसे परिभाषित करें। क्लास के मेथड्स C में लागू किए गए हैं, लेकिन क्लास को अभी भी पायथन से इंस्टेंशिएट, सबक्लास और विस्तारित किया जा सकता है। विरासत के साथ यही तकनीक मौजूदा पायथन क्लास को C में लिखे गए मेथड्स के साथ विस्तारित करने के लिए भी उपयोग की जा सकती है। इस तकनीक में, PyClass_New का पहला आर्गुमेंट NULL पास किया जाता है, यह दिखाते हुए कि नई क्लास का कोई बेस क्लास नहीं है। फिर हम इस स्थान पर बेस क्लासेस का टपल पास करते हैं, और हमें सामान्य पायथन विरासत व्यवहार मिलता है, भले ही हमारी नई क्लास पायथन सोर्स कोड के बजाय C एक्सटेंशन में बनाई जा रही हो।
उदाहरण
#include\nstatic PyObject* Foo_init(PyObject *self, PyObject *args) {\n printf("Foo.__init__ called\\n");\n Py_INCREF(Py_None);\n return Py_None;\n}\nstatic PyObject* Foo_doSomething(PyObject *self, PyObject *args) {\n printf("Foo.doSomething called\\n");\n Py_INCREF(Py_None);\n return Py_None;\n}\nstatic PyMethodDef FooMethods[] = {\n {"__init__", Foo_init, METH_VARARGS, "doc string"},\n {"doSomething", Foo_doSomething, METH_VARARGS, "doc string"},\n {0, 0},\n};\nstatic PyMethodDef ModuleMethods[] = {\n {0, 0}\n};\n#ifdef __cplusplus\nextern "C"\n#endif\nvoid initFoo() {\n PyMethodDef *def;\n /* नया मॉड्यूल और क्लास ऑब्जेक्ट बनाएं */\n PyObject *module = Py_InitModule("Foo", ModuleMethods);\n PyObject *moduleDict = PyModule_GetDict(module);\n PyObject *classDict = PyDict_New();\n PyObject *className = PyString_FromString("Foo");\n PyObject *fooClass = PyClass_New(NULL, classDict, className);\n PyDict_SetItemString(moduleDict, "Foo", fooClass);\n Py_DECREF(classDict);\n Py_DECREF(className);\n Py_DECREF(fooClass);\n /* क्लास में मेथड्स जोड़ें */\n for (def = FooMethods; def->ml_name != NULL; def++) {\n PyObject *func = PyCFunction_New(def, NULL);\n PyObject *method = PyMethod_New(func, NULL, fooClass);\n PyDict_SetItemString(classDict, def->ml_name, method);\n Py_DECREF(func);\n Py_DECREF(method);\n }\n}