Я пишу систему привязки, которая предоставляет классы и функции для 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, которые делают это автоматически, и у меня есть веские основания не использовать их, какими бы замечательными они ни были.)