Python c api和__add__调用

时间:2010-02-26 14:52:34

标签: python api

我正在编写一个绑定系统,以稍微不同寻常的方式将类和函数公开给python。

通常会创建一个python类型并提供表示该类型方法的函数列表,然后允许python使用其通用tp_getattro函数来选择正确的函数。

由于我不会进入这里的原因,我不能这样做,并且必须提供我自己的tp_getattro函数,它从其他地方选择方法并返回我自己的'bound方法'包装器。这工作正常,但意味着类型方法未在其字典中列出(因此dir(MyType())没有显示任何有趣的内容)。

问题是我似乎无法使__add__方法起作用。请参阅以下示例:

>>> from mymod import Vec3
>>> v=Vec3()
>>> v.__add__
<Bound Method of a mymod Class object at 0xb754e080>
>>> v.__add__(v)
<mymod.Vec3 object at 0xb751d710>
>>> v+v
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'mymod.Vec3' and 'mymod.Vec3'

正如您所看到的,Vec3有一个__add__方法可以调用,但是python's +拒绝使用它。

如何让python使用它? +运算符如何在python中实际工作,以及它用什么方法来查看是否可以添加两个任意对象?

感谢。

(P.S。我知道其他系统,如Boost.Python和SWIG,它们会自动执行此操作,我有充分的理由不使用它们,无论它们多么精彩。)

1 个答案:

答案 0 :(得分:3)

您的number methods结构中是否有nb_add(由type object的字段tp_as_number指出)?