python动态类型如何用c语言实现_如何在Python C-API中动态创建派生类型

如果这个答案很糟糕,我在前面道歉,但你可以在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值