Python的C API与__add__调用
我正在写一个绑定系统,目的是以一种稍微不寻常的方式将类和函数暴露给Python。
通常情况下,我们会创建一个Python类型,并提供一个函数列表,这些函数代表了该类型的方法,然后让Python使用它的通用函数tp_getattro来选择合适的方法。
但由于一些原因,我不能这样做,必须提供我自己的tp_getattro
函数,从其他地方选择方法,并返回我自己的“绑定方法”包装器。这种做法是可行的,但这意味着类型的方法不会在它的字典中列出(所以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的+运算符却拒绝使用它。
我该如何让Python使用这个方法呢?在Python中,+运算符实际上是如何工作的,它使用什么方法来判断两个任意对象是否可以相加?
谢谢。
(顺便说一下,我知道还有其他系统,比如Boost.Python和SWIG,它们可以自动处理这些事情,我有充分的理由不使用它们,尽管它们可能非常好。)