Ich bin nicht sicher, was du meinst durch die „normale Python-Klasse-creation-Mechanismus“, aber ...
es gibt eine Dokumentation Seite widmet sich: https://docs.python.org/3/extending/newtypes.html - es einen neuen Typ in einem Erweiterungsmodul erzeugt, das auf die Schaffung einer neuen class
in Python entspricht Code.
Die minimale Beispiel präsentiert ist:
#include <Python.h>
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(&noddy_NoddyType) < 0)
return NULL;
m = PyModule_Create(&noddymodule);
if (m == NULL)
return NULL;
Py_INCREF(&noddy_NoddyType);
PyModule_AddObject(m, "Noddy", (PyObject *)&noddy_NoddyType);
return m;
}
Das ist genau das, was ich nicht wollen. Ich möchte keinen Erweiterungstyp, sondern nur eine zur Laufzeit erstellte Python-Klasse. –
@JeroenDemeyer: Ihre Fragen sagen "Python C/API entspricht einer Aussage wie", so habe ich das verstanden. Bitte überlege, deine Frage umzuformulieren. –
Ich meine "Äquivalent" im wörtlichsten Sinne. Ich meine nicht "ähnlich", ich meine "genau das Gleiche". –