Возможные дубликаты:
Python: определение моих собственных операторов?
Эмпирические правила для того, когда использовать оператор, перегружающийся в PythonДействительно ли возможно перегрузить операторы в Python? Если так, может каждый определять новые операторы, такой как
++
и<<
?
Как уже упоминалось в других ответах, вы действительно можете перегрузить операторы (путем определения специальных методов в классе, который вы пишете, то есть методов, имена которых начинаются и заканчиваются двумя символами подчеркивания). Все подробности здесь .
Чтобы завершить ответы на ваши вопросы: вы не можете определять новые операторы; но <<
не новый оператор, это уже существующий, и он перегружен определением в классе метода __ lshift __
.
В качестве исторической заметки это тоже довольно во многом ситуация в C ++, но точный набор операторов, которые вы можете перегрузить, различается между двумя языками. Например, в C ++ нельзя перегрузить доступ к атрибутам .
; в Python это можно сделать с помощью __ getattr __
(или __ getattribute __
, с другой семантикой) и __ setattr __
. И наоборот, в Python =
(простое присваивание) не является оператором, поэтому вы не можете его перегрузить, тогда как в C ++ это оператор, и вы можете его перегрузить.
<<
- это оператор оператор и может быть перегружен на обоих языках - так <<
и >>
, не теряя своей первоначальной коннотации сдвигов влево и вправо, также стали форматированием ввода-вывода операторы в C ++ (не в Python! -).
См .: http://docs.python.org/reference/datamodel.html#special-method-names .
Класс может реализовывать определенные операции, которые вызываются с помощью специального синтаксиса (например, арифметические операции или индексирование и срезы ) путем определения методов со специальными именами. Это подход Python к перегрузке операторов, позволяющий классам определять собственное поведение по отношению к операторам языка.
Да и нет. Я не думаю, что вы можете определять свои собственные операторы, но вы можете перегрузить существующие - вы можете сделать это, переопределив специальный метод оператора. Например,
to override>, вы можете переопределить __ gt __ ()
, для! = override __ ne __ ()
и так далее.