Я не уверен, что вы имеете в виду «нормальный механизм создания класса Python», но ...
Для этого есть страница документации: https://docs.python.org/3/extending/newtypes.html - он создает новый тип в модуле расширения, что эквивалентно созданию нового class
в Python код.
Минимальный пример представлен там:
#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;
}
Это именно то, что я НЕ хотеть. Я не хочу тип расширения, но только класс Python, созданный во время выполнения. –
@JeroenDemeyer: В ваших вопросах говорится: «Python C/API эквивалент выражения вроде», так что это то, что я понял. Пожалуйста, подумайте о том, чтобы перефразировать ваш вопрос, чтобы быть более четким. –
Я имею в виду «эквивалент» в самом буквальном смысле слова. Я не имею в виду «похожие», я действительно имею в виду «точно то же самое». –