将派生类传递给采用 SWIG Python 中的基类的函数

Posted

技术标签:

【中文标题】将派生类传递给采用 SWIG Python 中的基类的函数【英文标题】:Passing a derived class to a function taking a base class in SWIG Python 【发布时间】:2013-08-01 03:51:37 【问题描述】:

我使用 Python 3.3 和 SWIG 2.0.10 将派生类传递给采用基类的函数。

相同的 SWIG .i 文件用于 C#,并且运行良好。但是,在 Python 中,SWIG 报告说没有接受派生类型的 C++ 方法 - 只有接受基类型的方法。该陈述是正确的,但我需要传递派生类型并让 SWIG 直接调用,就好像它是基类型一样。

派生类型在 C++ 中不存在。它仅存在于 Python(和 C#)中。但是,我们启用了导向器,并且如前所述,它在 C# 中运行良好。

Python 2.6 和 2.7 中的结果相同。

C++

class Base ;
// Note: there is NO "class Derived" in C++.
void f(Base* a)  ... 

Python

class Derived(Base): pass

x = Derived()
f(x) # SWIG runtime error - In C++ there is no f(Derived*) - there is only f(Base*)

【问题讨论】:

【参考方案1】:

问题是在 Derived 类中我没有正确调用 Base.__init__()。

一旦我解决了这个问题,Swig 中的多态性就可以正常工作了。

class Derived(Base):
    def __init__(self):
        super(Derived, self).__init__()

【讨论】:

以上是关于将派生类传递给采用 SWIG Python 中的基类的函数的主要内容,如果未能解决你的问题,请参考以下文章

将派生对象分配给函数内的基类指针

如何在 SWIG/Python 中将结构列表传递给 C

c ++将不同的类传递给函数

SWIG:将 2d numpy 数组传递给 C 函数 f(double a[])

SWIG:将 Python 字符串传递给 void 指针类型的参数

使用 SWIG 将 Python 数组传递给 c++ 函数