3

C PyObject 结构包含字段tp_as_number和。在什么情况下会调用这些?任何人都可以提供一些示例 Python 代码来调用这些 C 方法吗?tp_as_sequencetp_as_mapping

4

1 回答 1

3

这些方法相当于 python 的特殊方法,并且在相同的情况下被调用。例如tp_as_number->nb_add在执行时调用a + ba是扩展类型。它相当于__add__inplace_*函数是方法的等价物__i*__

请注意,这些__r*__方法的实现只是将参数交换到普通函数,因此5 + a扩展a类型将首先尝试调用 的数字版本,在nb_add此失败后它尝试nb_add将其作为第一个参数和第二个参数。a5a

tp_as_mappingtp_as_sequence结构也是如此。和函数由内置函数 调用mp_length,等效于。从理论上讲,您可以为and实现不同的功能,在这种情况下具有优先权(这可以从源代码中看到,即使我不知道是否记录了这种行为)。sq_lengthlen__len__mp_lengthsq_lengthsq_length

还要注意,例如,+运算符可以在不同的功能中实现。在sq_concat尝试之后调用nb_add,因此扩展类型可以支持+运算符而无需nb_add设置函数。

于 2013-02-09T12:59:20.803 回答