Python C++ extension Singleton

Python C++ extension Singleton

本文关键字:Singleton extension C++ Python      更新时间:2023-10-16

我正在尝试为Python(3.x)编写一个C++扩展,它允许我为Raspberry Pi使用特定的硬件屏蔽
我在编写C和/或C++方面没有任何经验,但通过使用Python网站上的文档,我确实做到了。我想做的是将我的类型设为Singleton,但如果init方法返回错误(-1),那么对构造函数的第二次调用就会把事情搞砸。如果init返回时没有错误,那么它实际上可以按预期工作。

我的代码的重要部分:

static PyObject *
MyType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
    static MyType *self = NULL;  /* static to create a Singleton */
    if (self == NULL) {
        self = (MyType *)type->tp_alloc(type, 0);
        self->is_initialized = false;
    }
    else {
        Py_XINCREF(self);
    }
    return (PyObject *)self;
}
static int
MyType_init(MyType *self, PyObject *args, PyObject *kwds)
{
    const char *i2c_addr;
    self->rpi_model = RPI_MODEL_B;
    self->enabled_components = COMPONENTS_ALL_BIT;
    static char *kwlist[] = {"rpi_model", "enabled_components", NULL};
    if (self != NULL && !self->is_initialized) {
        if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwlist, &self->rpi_model, &self->enabled_components)) {
            return -1;
        }
    }
    /*
        DO SOME INITIALIZATION STUFF
    */
    if (!self->component_A->testConnection()) {
        PyErr_SetString(InitializationException, "Unable to communicate with component_A.");
        return -1;
    }
    self->is_initialized = true;
    return 0;
}

我还在tp_dealloc成员中安装了以下功能:

static void
MyType_dealloc(PyObject *self)
{
    Py_TYPE(self)->tp_free((PyObject*)self);
}

我在这些方法中放入了一些print语句(用于调试),在对MyType_new的第二次调用中,似乎是self != NULL,尽管MyType_dealloc方法已在初始化失败时执行。

有人能给我指正确的方向吗?

看起来MyType_dealloc没有将self设置回NULL

此外,您不需要同时拥有__new____init__——只需将它们全部放在__new__中即可。