向Python Swig模板类添加新方法

5 投票
1 回答
3639 浏览
提问于 2025-04-17 10:06

我需要在我的swig模板类中添加一个新方法,比如说:

我在myswig.i中声明一个模板类,像这样:

%template(DoubleVector) vector<double>;

这会在生成的.py文件中生成一个名为“DoubleVector”的类,并且会有一些自动生成的方法,比如func1()、func2()和func3()。这些方法是自动生成的,我无法控制它们。

现在,如果我想给这个类(DoubleVector)添加一个叫“func4()”的新方法,我该怎么做呢?这可能吗?

我知道有一个叫做%pythoncode的标识符,但我无法用它在这个模板类中定义一个新函数。

1 个回答

10

假设你有一个接口文件,内容像这样:

%module test

%{
#include <vector>
%}

%include "std_vector.i"
%template(DoubleVector) std::vector<double>;

想要给 DoubleVector 增加更多功能,最简单的方法就是在 C++ 中写代码,并在 SWIG 接口文件里使用 %extend

%extend std::vector<double> {
  void bar() {
    // don't for get to #include <iostream> where you include vector:
    std::cout << "Hello from bar" << std::endl;       
  }
}

这样做的好处是,它可以适用于你用 SWIG 目标的任何语言,不仅仅是 Python。

你也可以使用 %pythoncode 和一个 未绑定函数 来实现:

%pythoncode %{
def foo (self):
        print "Hello from foo"

DoubleVector.foo = foo
%}

下面是一个运行这个的例子:

Python 2.6.7 (r267:88850, Aug 11 2011, 12:16:10) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> d = test.DoubleVector()
>>> d.foo()
Hello from foo
>>> d.bar()
Hello from bar
>>> 

撰写回答