2013-02-09 2 views

ответ

3

Эти методы эквивалентны special methods python и вызывают в тех же обстоятельствах. Например, вызывается tp_as_number->nb_add при выполнении a + b и a - тип расширения. Это эквивалент __add__. Функции inplace_* являются эквивалентами методов __i*__.

Обратите внимание, что __r*__ метод реализованы просто свапирование аргументов нормальных функций, таким образом, 5 + a где a является тип расширения сначала попытается вызвать цифровую версию nb_add, после того, как это не удалось его пытается nb_add из a положить 5 в качестве первого аргумент и a как второй.

То же самое верно для tp_as_mapping и tp_as_sequence структур. Функции mp_length и sq_length вызываются встроенной функцией len и эквивалентны __len__. Теоретически вы можете реализовать разные функции для mp_length и sq_length, и в этом случае приоритет sq_length (это видно из исходного кода, хотя я не знаю, документировано ли это поведение).

Также обратите внимание, что, например, оператор + может быть реализован в различных функциях. sq_concat вызывается после попытки nb_add, и, таким образом, тип расширения может поддерживать оператор + без наличия набора функций nb_add.

+0

Большое спасибо. Был бы признателен, если бы вы могли указать мне на какой-нибудь дополнительный документ, если есть ... – isedev

+0

@isedev. Вы можете найти документацию [здесь] (http://docs.python.org/2/c-api/objimpl.html). Вы также можете найти некоторую информацию в [учебнике] (http://docs.python.org/2/extending/newtypes.html#abstract-protocol-support) – Bakuriu

Смежные вопросы