如何使 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<> 创建接口?