我正在编写一个绑定系统,以稍微不同寻常的方式将类和函数公开给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,它们会自动执行此操作,我有充分的理由不使用它们,无论它们多么精彩。)