使用 Python C/API,如何使用普通 Python 类创建机制(即:不是扩展类型)创建普通 Python 类?
换句话说,什么是 Python C/API 等效语句(从某种意义上说,它在所有情况下都完全相同)
class X(bases):
...some methods/attributes here...
最佳答案
我不确定“正常的 Python 类创建机制”是什么意思,但是......
有专门针对此的文档页面:https://docs.python.org/3/extending/newtypes.html -- 它在扩展模块中创建一个新类型,相当于在 Python 代码中创建一个新的 class
。
这里给出的最小示例是:
#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 C/API : how to create a normal class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39958741/