如果这个答案很糟糕,我在前面道歉,但你可以在PythonQt中找到这个想法的实现,特别是我认为以下文件可能是有用的参考:
PythonQtClassInfo.cpp
PythonQtClassInfo.h
PythonQtClassWrapper.cpp
PythonQtClassWrapper.h
来自PythonQtClassWrapper_init的这个片段跳出来对我来说有点有趣:
static int PythonQtClassWrapper_init(PythonQtClassWrapper* self, PyObject* args, PyObject* kwds)
{
// call the default type init
if (PyType_Type.tp_init((PyObject *)self, args, kwds) < 0) {
return -1;
}
// if we have no CPP class information, try our base class
if (!self->classInfo()) {
PyTypeObject* superType = ((PyTypeObject *)self)->tp_base;
if (!superType || (superType->ob_type != &PythonQtClassWrapper_Type)) {
PyErr_Format(PyExc_TypeError, "type %s is not derived from PythonQtClassWrapper", ((PyTypeObject*)self)->tp_name);
return -1;
}
// take the class info from the superType
self->_classInfo = ((PythonQtClassWrapper*)superType)->classInfo();
}
return 0;
}
值得注意的是,PythonQt确实使用了包装器生成器,因此它并不完全符合您的要求,但我个人认为尝试超越vtable并不是最优化的设计。 基本上,有许多不同的C ++包装器生成器用于Python,人们使用它们是有充分理由的 - 它们都有记录,搜索结果和堆栈溢出中都有例子。 如果你手动推出一个以前没有人见过的解决方案,那么如果它们遇到问题就会更难调试。 即使它是闭源的,下一个必须维护它的人也会挠头,你必须向每个出现的新人解释它。
一旦你的代码生成器工作,你需要做的就是维护底层的C ++代码,你不必手动更新或修改你的扩展代码。 (这可能与您使用的诱人解决方案相差不远)
所提出的解决方案是打破类型安全性的一个例子,新引入的PyCapsule提供了更多的保护(当按照指示使用时)。
因此,尽管它可能不是以这种方式实现派生/子类的最佳长期选择,而是包装代码并让vtable做它最擅长的事情,当新人有问题时你可以指出他 任何解决方案最适合的文档。
这只是我的观点。:d