Подтвердить что ты не робот

Перегрузка оператора в python

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Смотрите: http://docs.python.org/reference/datamodel.html#special-method-names.

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

Ответ 3

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