Python C++ extension Singleton
Python C++ extension Singleton
我正在尝试为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__
中即可。
相关文章:
- C++ Singleton - Prevent ::instance() to variable
- 使用 Python Extension API 包装复杂C++类
- Singleton ofstram:已创建但未写入的文件
- 静态链接 glibc & boost_python36 for Python extension
- c++ 提升如果 .extension() == " "这意味着这个文件是一个文件夹?
- XCode 警告"此处需要实例化变量'Singleton:<Foo>:_instance',但没有可用的定义
- C++Singleton实例禁用重新调用
- 没有从Singleton到嵌套Listener*的可行转换
- 禁止复制构造函数和赋值运算符singleton类
- Singleton模式中的手动析构函数调用:调用多次
- 什么是"MFC Dialog Extension"?(Windows/C++ 新手 - Linux 背景)
- 如何将Singleton类信号连接到MainWindow类插槽或方法
- 找不到 <torch/extension.h>
- Helgrind 报告了使用 Singleton 及其构造函数之间可能存在的竞争
- 关于std::cout,为什么使用"extern"比"singleton pattern"
- C++"extension methods"标准化的建议在哪里?
- 禁止显示"use of the 'X' attribute is a C++17 extension"警告
- 静态库中只有一个C 11 Singleton的实例
- Forward宣布了Singleton班级,并带有Freshial声明的朋友功能
- Python C++ extension Singleton