이 메서드는 C 확장 모듈에서 새 Python 클래스를 정의하는 방법을 보여줍니다. 클래스의 메서드는 C로 구현되지만 클래스는 여전히 Python에서 인스턴스화, 하위 클래스화 및 확장할 수 있습니다. 상속이 있는 동일한 기술을 사용하여 C로 작성된 메서드를 사용하여 기존 Python 클래스를 확장할 수도 있습니다. 이 기술에서 PyClass_New에 대한 첫 번째 인수는 NULL로 전달되어 새 클래스에 기본 클래스가 없음을 보여줍니다. 그런 다음 이 지점에서 기본 클래스의 튜플을 전달하면 새 클래스가 Python 소스 코드가 아닌 C 확장으로 빌드되더라도 정상적인 Python 상속 동작을 얻게 됩니다.
예시
#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); } }