-
PyObject *MyClass_new(PyTypeObject *type, PyObject *args, PyObject *kwds){
-
std::cout << "MtClass_new() called!" << std::endl;
-
-
MyClassObject *self;
-
self = (MyClassObject*) type->tp_alloc(type, 0);
-
if(self != NULL){ // -> 分配成功
-
// 赋初始值
-
self->m_value = https://www.isolves.com/it/cxkf/yy/Python/2023-01-03/0;
-
self->m_myclass = NULL;
-
}
-
return (PyObject*) self;
-
}
实际的初始化发生在
MyClass_init
中,它对应于 Python 中的 docs.python.org 方法:-
int MyClass_init(PyObject *self, PyObject *args, PyObject *kwds){
-
-
((MyClassObject *)self)->m_value = https://www.isolves.com/it/cxkf/yy/Python/2023-01-03/123;
-
-
MyClassObject* m = (MyClassObject*)self;
-
m->m_myclass = (MyClass*)PyObject_Malloc(sizeof(MyClass));
-
-
if(!m->m_myclass){
-
PyErr_SetString(PyExc_RuntimeError, "Memory allocation failed");
-
return -1;
-
}
-
-
try {
-
new (m->m_myclass) MyClass();
-
} catch (const std::exception& ex) {
-
PyObject_Free(m->m_myclass);
-
m->m_myclass = NULL;
-
m->m_value = https://www.isolves.com/it/cxkf/yy/Python/2023-01-03/0;
-
PyErr_SetString(PyExc_RuntimeError, ex.what());
-
return -1;
-
} catch(...) {
-
PyObject_Free(m->m_myclass);
-
m->m_myclass = NULL;
-
m->m_value = https://www.isolves.com/it/cxkf/yy/Python/2023-01-03/0;
-
PyErr_SetString(PyExc_RuntimeError, "Initialization failed");
-
return -1;
-
}
-
-
return 0;
-
}
如果你想在初始化过程中传递参数,必须在此时调用 docs.python.org 。简单起见,本例将忽略初始化过程中传递的所有参数 。在函数的第一部分中,
PyObject
指针(self
)被强转为MyClassObject
类型的指针,以便访问其他成员 。此外,还分配了 C++ 类的内存,并执行了构造函数 。注意,为了防止内存泄漏,必须仔细执行异常处理和内存分配(还有释放) 。当引用计数将为零时,
MyClass_dealloc
函数负责释放所有相关的堆内存 。在文档中有一个章节专门讲述关于 C 和 C++ 扩展的内存管理 。
推荐阅读
- Python 教你快速批量下载抖音去水印短视频
- 为什么我抓不到baidu的数据包?
- Python破解24点游戏
- 为什么Java线程没有Running状态?
- 一次服务器沦陷为肉鸡后的排查过程
- 国外大学生用AI写论文,还次次拿到A
- 为什么短短两周之后就鲜有人继续讨论ChatGPT了?
- 开发一个简单的热搜微信小程序
- 戚薇|戚薇二胎产后首露面,发长文卖惨为月子中心打广告,网友:快封杀
- 为什么有些腕表被称为医生表?