Ответ 1
Как уже упоминалось в других ответах, вы действительно можете перегрузить операторы (определив специальные методы в классе, который вы пишете, т.е. методы, имена которых начинаются и заканчиваются двумя символами подчеркивания). Все подробности здесь.
Чтобы ответить на ваши вопросы, вы не можете определить новые операторы; но <<
не новый оператор, он уже существующий, и он перегружен определением в классе метода __lshift__
.
Как историческое примечание, это также в значительной степени ситуация на С++, но точный набор операторов, которые вы можете перегрузить, отличается между двумя языками. Например, в С++ вы не можете перегружать доступ к атрибутам, .
; в Python вы можете с __getattr__
(или __getattribute__
с другой семантикой) и __setattr__
. И наоборот, в Python =
(простое назначение) не является оператором, поэтому вы не можете его перегрузить, а на С++ это оператор, и вы можете его перегрузить.
<<
является оператором и может быть перегружен на обоих языках - то, что <<
и >>
, не теряя при этом первоначального коннотации левого и правого сдвигов, также стали операторами форматирования ввода-вывода в С++ (не в Python! -).