2009-12-20 4 views
38

Возможные Дубликаты:
Python: defining my own operators?
Rules of thumb for when to use operator overloading in pythonперегрузка операторов в питона

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

+2

Повторяющийся вопрос: http://stackoverflow.com/questions/932328. См. Также http://stackoverflow.com/questions/1552260. –

+2

Это может быть дублированный вопрос, но я нашел приемлемый ответ более полезным, чем в других вопросах, потому что он ссылается на описание всех методов __ xxx __. – ToolmakerSteve

+0

@ToolmakerSteve - Извините, я отметил и удалил это как не ответ. Это была не что иное, как ссылка, а это значит, что она была связана с linkrot. – ArtOfWarfare

ответ

66

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

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

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

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

+0

+1 для ссылки на список методов __ xxx __. Я не мог найти эту ссылку в ответах на другие вопросы, что этот вопрос считается дубликатом. – ToolmakerSteve

6

См. http://docs.python.org/reference/datamodel.html#special-method-names.

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

4

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

Смежные вопросы