Python C/API : how to create a normal class

标签 python class python-c-api

使用 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/

相关文章:

python - 如何使用 Python 在后台运行方法

c++ - 将函数实现为自由函数而不是 C++ 中的成员有什么优势吗?

c++ - 如何在 C++ 程序中使用长度指示器

Python C/API 分配一个 C++ 变量

python - 导入错误:C 扩展:没有名为 'parsing' 的模块未构建

python - 使用 RGB 元组的 Matplotlib pcolormesh

python - 预先确定放大叶片的最佳水平

java - 在 jar 中运行类时从 jar 中获取所有 .class

python - python 中的 C 代码和在 C 代码中复制数组

python - 在 Pandas 中用条件填充行