gpt4 book ai didi

c++ - Python C++ 扩展中的继承

转载 作者:太空狗 更新时间:2023-10-29 19:50:31 24 4
gpt4 key购买 nike

我有需要与插入模块的 Python 通信的 C++ 库。通信假设由 Python 实现一些回调 c++ 接口(interface)。

我已经阅读过有关编写扩展的内容,但不知道如何开发继承。

关于:C++:

class Broadcast
{
void set(Listener *){...
}

class Listener
{
void notify(Broadcast* owner) = 0;
}

我需要类似 Python 的东西:

class ListenerImpl(Listener):
...
def notify(self, owner):
...

请注意,我不想使用 Boost。

最佳答案

由于我必须在我的一个项目中实现单一继承作为 Python C-API 的一部分,所以我构建了一个 short example here .我在代码中标记了重要语句。

诀窍是继承子类结构顶部的基结构(省略 PyObject_HEAD 语句)。

/* OBJECT */
typedef struct {
MyPy_BaseClass super; // <----- PUTTING THIS FIRST INHERITS THE BASE PYTHON CLASS!!!
// Own variables:
// e.g int x = 0;
} MyPy_InheritanceClass;

也不要忘记将基类型赋予子类类型。它有一个标志(参见 /* tp_base */)。

  static PyTypeObject MyPy_InheritanceClass_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"MyPy_InheritanceClass", /* tp_name */
sizeof(MyPy_InheritanceClass), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)MyPy_InheritanceClass_dealloc, /* 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 |
Py_TPFLAGS_BASETYPE, /* tp_flags */
"MyPy_InheritanceClass", /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
MyPy_InheritanceClass_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
&MyPy_BaseClass_Type, /* tp_base */ // <------ GIVE THE BASE_CLASS TYPE
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
(initproc) MyPy_InheritanceClass_init, /* tp_init */
0, /* tp_alloc */
MyPy_InheritanceClass_new, /* tp_new */
};

关于c++ - Python C++ 扩展中的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2200912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com