6.17 类扩展

使用%extend指令可以为类添加新方法。这个指令主要被与代理类连接,用于给存在的类添加额外的功能。例如:

  1. %module vector
  2. %{
  3. #include "vector.h"
  4. %}
  5. class Vector {
  6. public:
  7. double x,y,z;
  8. Vector();
  9. ~Vector();
  10. ... bunch of C++ methods ...
  11. %extend {
  12. char *__str__() {
  13. static char temp[256];
  14. sprintf(temp,"[ %g, %g, %g ]", $self->x,$self->y,$self->z);
  15. return &temp[0];
  16. }
  17. }
  18. };

这段代码给我们的类添加了一个__add__方法,生成对象的字符串表示。在Python中,这样的方法允许我们使用print名字打印对象的值。

  1. >>>
  2. >>> v = Vector();
  3. >>> v.x = 3
  4. >>> v.y = 4
  5. >>> v.z = 0
  6. >>> print(v)
  7. [ 3.0, 4.0, 0.0 ]
  8. >>>

C++的this指针经常被用于访问成员变量、方法等。特殊标量$self应该用在你需要this的地方。上面的例子演示了使用这种方式访问成员变量的方法了。注意,通过$self引用的变量必须是公有的成员,因为这些代码最终会生成全局函数,所以不能访问任何非公有的成员。C++中隐式指针this在C++方法中可用,但在%extend指令中不可用。为了在扩展类或其基类中访问所有成员,必须使用显式的this。下面的例子演示了如何访问基类的成员:

  1. struct Base {
  2. virtual void method(int v) {
  3. ...
  4. }
  5. int value;
  6. };
  7. struct Derived : Base {
  8. };
  9. %extend Derived {
  10. virtual void method(int v) {
  11. $self->Base::method(v); // akin to this->Base::method(v);
  12. $self->value = v; // akin to this->value = v;
  13. ...
  14. }
  15. }

%extend指令块中,下面的特使变量将被扩展:$name$sysnameovername$decl$fulldeclparentclassname$parentclasssymname特殊变量这一节对每个特殊变量都做了详细介绍。

%extend指令与对C结构体处理方法是一样的。请参考给C结构体添加成员函数获得等多信息。

兼容性注释:%extend指令是 SWIG 1.1中%addmethods指令的新的名字。因为%addmethods不仅仅只是给结构体扩展方法,所以我们给它选择了另外一个更合适的指令名。