Возможные дубликаты:
Python: определение моих собственных операторов?
Правила для того, чтобы использовать перегрузку оператора в python
Можно ли перегрузить операторы в Python? Если да, можно определить новые операторы, такие как ++
и <<
?
Возможные дубликаты:
Python: определение моих собственных операторов?
Правила для того, чтобы использовать перегрузку оператора в python
Можно ли перегрузить операторы в Python? Если да, можно определить новые операторы, такие как ++
и <<
?
Как уже упоминалось в других ответах, вы действительно можете перегрузить операторы (определив специальные методы в классе, который вы пишете, т.е. методы, имена которых начинаются и заканчиваются двумя символами подчеркивания). Все подробности здесь.
Чтобы ответить на ваши вопросы, вы не можете определить новые операторы; но <<
не новый оператор, он уже существующий, и он перегружен определением в классе метода __lshift__
.
Как историческое примечание, это также в значительной степени ситуация на С++, но точный набор операторов, которые вы можете перегрузить, отличается между двумя языками. Например, в С++ вы не можете перегружать доступ к атрибутам, .
; в Python вы можете с __getattr__
(или __getattribute__
с другой семантикой) и __setattr__
. И наоборот, в Python =
(простое назначение) не является оператором, поэтому вы не можете его перегрузить, а на С++ это оператор, и вы можете его перегрузить.
<<
является оператором и может быть перегружен на обоих языках - то, что <<
и >>
, не теряя при этом первоначального коннотации левого и правого сдвигов, также стали операторами форматирования ввода-вывода в С++ (не в Python! -).
Смотрите: http://docs.python.org/reference/datamodel.html#special-method-names.
Класс может реализовывать определенные операции, которые вызываются специальным синтаксисом (например, арифметическими операциями или подпиттингом и разрезанием), определяя методы со специальными именами. Это подход Pythons к перегрузке операторов, позволяющий классам определять свое поведение по отношению к операторам языка.
Да, и нет. Я не думаю, что вы можете определить своих собственных операторов, но вы можете перегрузить существующие, вы можете сделать это, переопределив специальный метод оператора. Например,
для переопределения > вы можете переопределить __gt__()
, для!= переопределить __ne__()
и так далее.