Python C/API: how to create a normal class
<p>Using the Python C/API, how do I create a normal Python class using the normal Python class-creation mechanism (i.e.: not an extension type)?</p>

<p>In other words, what is the Python C/API equivalent (in the sense that it does <em>exactly</em> the same in all cases) of a statement</p>

<pre><code>class X(bases):
    ...some methods/attributes here...
</code></pre>

<p>I'm not sure what you mean by "the normal Python class-creation mechanism", but...</p>

<p>There's a documentation page dedicated to this: <a href="https://docs.python.org/3/extending/newtypes.html" rel="nofollow">https://docs.python.org/3/extending/newtypes.html</a> -- it creates a new type in an extension module, which is equivalent to creating a new <code>class</code> in Python code.</p>

<p>The minimal example presented there is:</p>

<pre><code>#include &lt;Python.h&gt;

typedef struct {
    PyObject_HEAD
    /* Type-specific fields go here. */
} noddy_NoddyObject;

static PyTypeObject noddy_NoddyType = {
    PyVarObject_HEAD_INIT(NULL, 0)
    "noddy.Noddy",             /* tp_name */
    sizeof(noddy_NoddyObject), /* tp_basicsize */
    0,                         /* tp_itemsize */
    0,                         /* tp_dealloc */
    0,                         /* tp_print */
    0,                         /* tp_getattr */
    0,                         /* tp_setattr */
    0,                         /* tp_reserved */
    0,                         /* tp_repr */
    0,                         /* tp_as_number */
    0,                         /* tp_as_sequence */
    0,                         /* tp_as_mapping */
    0,                         /* tp_hash  */
    0,                         /* tp_call */
    0,                         /* tp_str */
    0,                         /* tp_getattro */
    0,                         /* tp_setattro */
    0,                         /* tp_as_buffer */
    Py_TPFLAGS_DEFAULT,        /* tp_flags */
    "Noddy objects",           /* tp_doc */
};

static PyModuleDef noddymodule = {
    PyModuleDef_HEAD_INIT,
    "noddy",
    "Example module that creates an extension type.",
    -1,
    NULL, NULL, NULL, NULL, NULL
};

PyMODINIT_FUNC
PyInit_noddy(void)
{
    PyObject* m;

    noddy_NoddyType.tp_new = PyType_GenericNew;
    if (PyType_Ready(&amp;noddy_NoddyType) &lt; 0)
        return NULL;

    m = PyModule_Create(&amp;noddymodule);
    if (m == NULL)
        return NULL;

    Py_INCREF(&amp;noddy_NoddyType);
    PyModule_AddObject(m, "Noddy", (PyObject *)&amp;noddy_NoddyType);
    return m;
}
</code></pre>

python class python-c-api