如何使 python 类满足 SWIG 中的接口?

Posted

技术标签:

【中文标题】如何使 python 类满足 SWIG 中的接口?【英文标题】:How do I make a python class satisfying an interface in SWIG? 【发布时间】:2018-08-01 20:27:50 【问题描述】:

我想在 Python 中创建一个使用 SWIG 满足 C++ 实例的对象。

鉴于我有一个像 Example.h 这样的例子:

struct iCat

    virtual int paws() const = 0;
;

int pawGiver(const iCat& cat);

struct cat : public iCat

    int paws() const
    
        return 4;
    
;

还有Example.cpp:

#include "Example.h"
int pawGiver(const iCat& cat)

    return cat.paws();

还有example.i

/* File : example.i */
%module example
%
#include "Example.h"
%
%include "Example.h"

上面的,当然编译好了。我写了下面的代码来尝试在 Python 中创建一个iCat,即:

import example;
class pyCat(example.iCat):
     def __init__(self):
             super().__init__()
     def paws(self):
             return 3;

z = pyCat()
example.pawGiver(z)

我正在尝试做的事情是否可能? Python 类可以实现 C++ 实例吗?我做错了什么?

【问题讨论】:

尝试运行代码时遇到什么错误? 我不认为你可以做你想做的事情,因为 C++ 类是一个抽象基类。我会等待比我更有知识的人来证明我错了。 是的,但是我的类实现了接口 如果你包含(example.iCat),你会得到AttributeError: No constructor defined - class is abstract,如果你放弃它,你会得到TypeError: in method 'pawGiver', argument 1 of type 'iCat const &' @Carbon,我理解动机和期望。我不认为 SWIG 可以生成所有中间代码来确保 pyCat 是可实例化的。但是,我在这里推测了一下。 【参考方案1】:

很容易。修改界面为:

/* File : example.i */
%module(directors="1") example
%
#include "Example.h"
%
%feature("director");
%include "Example.h"

运行良好。

【讨论】:

不错的收获!这是官方http://www.swig.org/Doc3.0/SWIGDocumentation.html#Go_director_enable的链接。问题和答案都非常有趣,所以,我们去,+2 ;)

以上是关于如何使 python 类满足 SWIG 中的接口?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 swig 将 python 类实例作为 c++ 函数的参数传递?

使用 swig 使 C++ 类看起来像一个 numpy 数组

如何在 swig & python 中为没有默认构造函数的 std::pair<> 创建接口?

Swig:返回向量的接口简单 C++ 类

如何在 Python 中处理 SWIG 导向器方法中的 void 指针

SWIG:你能否使用 SWIG 专门使用 C++ 头文件使 C++ 在 Python 中可用?