оператор, перегружающийся в Python [дубликат]

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

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

43
задан Community 23 May 2017 в 11:46
поделиться

3 ответа

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

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

В качестве исторической заметки это тоже довольно во многом ситуация в C ++, но точный набор операторов, которые вы можете перегрузить, различается между двумя языками. Например, в C ++ нельзя перегрузить доступ к атрибутам . ; в Python это можно сделать с помощью __ getattr __ (или __ getattribute __ , с другой семантикой) и __ setattr __ . И наоборот, в Python = (простое присваивание) не является оператором, поэтому вы не можете его перегрузить, тогда как в C ++ это оператор, и вы можете его перегрузить.

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

71
ответ дан 26 November 2019 в 22:52
поделиться

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

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

6
ответ дан 26 November 2019 в 22:52
поделиться

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

4
ответ дан 26 November 2019 в 22:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: