Python C++扩展中的继承

Dew*_*wfy 3 c++ python

我有c ++库需要与插入模块的Python进行通信.通信假设通过Python实现一些回调c ++接口.

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

所以关于:C++:

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

class Listener
{
    void notify(Broadcast* owner) = 0;
}
Run Code Online (Sandbox Code Playgroud)

我需要像Python这样的东西:

class ListenerImpl(Listener):
    ...
    def notify(self, owner):
        ...
Run Code Online (Sandbox Code Playgroud)

注意,我不想使用Boost.

qd-*_*die 7

由于我必须在我的项目中将单继承实现为Python C-API的一部分,所以我在这里构建了一个简短的例子.我在代码中标记了重要的语句.

诀窍是继承子类struct顶部的基础结构(省略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;
Run Code Online (Sandbox Code Playgroud)

也不要忘记将基类型赋予子类类型.有一面旗帜(见/* 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 */
};
Run Code Online (Sandbox Code Playgroud)


Tho*_*ers 5

PEP 253中解释了在C中编写可继承的Python类型.它与编写普通内置类型并没有什么不同,如扩展/嵌入指南中所述,但您必须通过Python API执行某些操作,例如属性访问,而不是直接访问任何内容.

将Python子类公开回C++代码有点单调乏味.Python类不是C++子类,所以你需要一个Listener包含PyObject*Python子类实例的C++包装类(它继承),它有一个notify将参数转换为Python对象的notify方法,调用方法PyObject*(例如,使用PyObject_CallMethod),将结果转换回C++类型,然后返回.