Python的c api和添加调用

Python的c api和添加调用,python,api,Python,Api,我正在编写一个绑定系统,它以一种稍微不同寻常的方式向python公开类和函数 通常,我们会创建一个python类型,并提供一个表示该类型方法的函数列表,然后允许python使用其通用的tp_getattro函数来选择正确的函数 出于我不想在这里讨论的原因,我不能这样做,必须提供我自己的tp_getattro函数,该函数从其他地方选择方法并返回我自己的“绑定方法”包装器。这很好,但意味着类型方法没有列在其字典中,因此dirMyType没有显示任何有趣的内容 问题是,我似乎无法让“添加”方法发挥作用

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

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

出于我不想在这里讨论的原因,我不能这样做,必须提供我自己的tp_getattro函数,该函数从其他地方选择方法并返回我自己的“绑定方法”包装器。这很好,但意味着类型方法没有列在其字典中,因此dirMyType没有显示任何有趣的内容

问题是,我似乎无法让“添加”方法发挥作用。请参见以下示例:

>>> 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会自动执行此操作,我有很好的理由不使用它们,不管它们有多好。

您的类型结构中是否有一个nb_添加项,该添加项由字段tp_作为您的编号指向?

没错,就是这样。有点恼人的是,它不只是执行PyObject_CallMethodObjArgsobj1、uuu add_uuu、obj2之类的操作,如果没有nb_add,则为NULL。谢谢@DaedalusFall,这是一个速度问题——通过依赖类型对象中的插槽和从中指向的辅助插槽,查找特殊方法几乎是瞬时的。在普通Python类中,槽是作为类语句操作的一部分填充的。