перегрузка оператора в Python

Возможные дубликаты:
Python: определение моих собственных операторов?
Практические правила, когда использовать перегрузку операторов в Python

Можно ли перегружать операторы в Python? Если да, можно ли определить новые операторы, такие как ++ и <<?


person Ahmad Dwaik    schedule 20.12.2009    source источник
comment
Повторяющийся вопрос: stackoverflow.com/questions/932328. См. Также stackoverflow.com/questions/1552260.   -  person Peter Hansen    schedule 20.12.2009
comment
Это может быть повторяющийся вопрос, но я нашел принятый ответ более полезным, чем другие вопросы, поскольку он связан с описанием всех методов __ xxx __.   -  person ToolmakerSteve    schedule 24.11.2013
comment
@ToolmakerSteve - Извините, я пометил и удалил это как не ответ. Это была не более чем ссылка, а это значит, что на нее можно было ссылаться.   -  person ArtOfWarfare    schedule 29.08.2014
comment
Так как это первое попадание в гугл, думаю надо разблокировать. Его блокировка заставляет людей делать дополнительный щелчок для получения информации, а в приведенных ниже ответах даже не приводятся примеры.   -  person Chris Redford    schedule 11.11.2014


Ответы (3)


Как уже упоминалось в других ответах, вы действительно можете перегрузить операторы (определив специальные методы в классе, который вы пишете, то есть методы, имена которых начинаются и заканчиваются двумя символами подчеркивания). Все подробности находятся здесь.

Чтобы завершить ответы на ваши вопросы: вы не можете определять новые операторы; но << не новый оператор, это уже существующий, и он перегружен путем определения в классе метода _ 2_.

В качестве исторической заметки, это также в значительной степени ситуация в C ++, но точный набор операторов, которые вы можете перегрузить, различается между двумя языками. Например, в C ++ нельзя перегрузить доступ к атрибутам, .; в Python вы можете использовать __getattr__ (или __getattribute__, с другой семантикой) и __setattr__. И наоборот, в Python = (простое присвоение) не является оператором, поэтому вы не можете его перегрузить, тогда как в C ++ это оператор, и вы можете его перегрузить.

<< является оператором и может быть перегружен на обоих языках - вот как << и >>, не теряя первоначального смысла сдвига влево и вправо, также стали операторами форматирования ввода-вывода в C ++ (не в Python! -).

person Alex Martelli    schedule 20.12.2009
comment
+1 за ссылку на список методов __ xxx __. Я не смог найти эту ссылку в ответах на другие вопросы, дубликатом которых считается этот вопрос. - person ToolmakerSteve; 24.11.2013

См. http://docs.python.org/reference/datamodel.html#special-method-names.

Класс может реализовывать определенные операции, которые вызываются специальным синтаксисом (например, арифметические операции или индексирование и разрезание), определяя методы со специальными именами. Это подход Python к перегрузке операторов, позволяющий классам определять собственное поведение по отношению к операторам языка.

person miku    schedule 20.12.2009

И да и нет. Я не думаю, что вы можете определять свои собственные операторы, но вы можете перегрузить существующие - вы можете сделать это, переопределив специальный метод оператора. Например, чтобы переопределить>, вы можете переопределить __gt__(), для! = Переопределить __ne__() и так далее.

person Sudhir Jonathan    schedule 20.12.2009