Как уже упоминалось в других ответах, вы действительно можете перегрузить операторы (определив специальные методы в классе, который вы пишете, т. Е. Методы, имена которых начинаются и заканчиваются двумя символами подчеркивания). Все детали: here.
Чтобы ответить на все вопросы, вы не можете определить новые операторы; но <<
не новый оператор, он уже существующий, и он перегружен, определяя в классе метод __lshift__
.
Как историческое примечание, это также в значительной степени ситуация на C++, но точный набор операторов, которые вы можете перегрузить, отличается между двумя языками. Например, в C++ вы не можете перегружать доступ к атрибутам, .
; в Python вы можете с __getattr__
(или __getattribute__
, с другой семантикой) и __setattr__
. И наоборот, в Python =
(простое назначение) не является оператором, поэтому вы не можете его перегрузить, а на C++ это оператор, и вы можете его перегрузить.
<<
является оператором, и может быть перегружен, на обоих языках - вот как <<
и >>
, не теряя свой первоначальный оттенок левых и правых сдвигов, а также стал I/операторы вывода форматирования в C++ (не в Python ! -).
Повторяющийся вопрос: http://stackoverflow.com/questions/932328. См. Также http://stackoverflow.com/questions/1552260. –
Это может быть дублированный вопрос, но я нашел приемлемый ответ более полезным, чем в других вопросах, потому что он ссылается на описание всех методов __ xxx __. – ToolmakerSteve
@ToolmakerSteve - Извините, я отметил и удалил это как не ответ. Это была не что иное, как ссылка, а это значит, что она была связана с linkrot. – ArtOfWarfare