相关疑难解决方法(0)

Python C-API对象分配

我想使用new和delete运算符来创建和销毁我的对象.

问题是python似乎把它分成了几个阶段.tp_new,tp_init和tp_alloc用于创建,tp_del,tp_free和tp_dealloc用于销毁.但是c ++只有new,它分配并完全构造对象和删除对象的析构和解除分配.

我需要提供哪些python tp_*方法以及它们必须做什么?

此外,我希望能够直接在c ++中创建对象,例如"PyObject*obj = new MyExtensionObject(args);" 我是否还需要以某种方式重载新运算符以支持此操作?

我也希望能够在python中继承我的扩展类型,我需要做些什么来支持这个?

我正在使用python 3.0.1.

编辑:好的,tp_init似乎使对象有点太可变了我正在做的事情(例如,取一个Texture对象,在创建后改变内容很好,但改变它的基本方面,如size,bitdept等会破坏许多现有的c ++东西,假设这些东西是固定的).如果我没有实现它,它只会阻止人们在构造之后调用__init__(或者至少忽略调用,就像元组一样).或者,如果在同一个对象上多次调用tp_init,我是否应该有一些抛出异常或某事的标志?

除此之外,我认为其余的大部分已经排序.

extern "C"
{
    //creation + destruction
    PyObject* global_alloc(PyTypeObject *type, Py_ssize_t items)
    {
        return (PyObject*)new char[type->tp_basicsize + items*type->tp_itemsize];
    }
    void global_free(void *mem)
    {
        delete[] (char*)mem;
    }
}
template<class T> class ExtensionType
{
    PyTypeObject *t;
    ExtensionType()
    {
        t = new PyTypeObject();//not sure on this one, what is the "correct" way to create an empty type object
        memset((void*)t, 0, sizeof(PyTypeObject));
        static PyVarObject init = {PyObject_HEAD_INIT, 0}; …
Run Code Online (Sandbox Code Playgroud)

c c++ python python-c-api python-3.x

7
推荐指数
1
解决办法
5565
查看次数

标签 统计

c ×1

c++ ×1

python ×1

python-3.x ×1

python-c-api ×1