Вопрос по python – Перегрузка оператора в python с объектом на правой стороне оператора

13

Недавно я узнал о перегрузке операторов в python и хотел бы знать, возможно ли следующее.

Рассмотрим следующую гипотезу / надуманный класс.

<code>class My_Num(object):
    def __init__(self, val):
        self.val = val
    def __add__(self, other_num):
        if isinstance(other_num, My_Num):
            return self.val + other_num.val
        else:
            return self.val + other_num
</code>

Я знаю, что так, как написано выше, я могу делать такие вещи

<code>n1 = My_Num(1)
n2 = My_Num(2)
n3 = 3
print n1 + n2
print n1 + n3
</code>

и те будут работать, как ожидалось. Я также знаю, что так, как написано в настоящее время, я не могу этого сделать.

<code>n1 = My_Num(1)
n2 = 2
print 2 + n1
</code>

Есть ли что-нибудь вокруг этого? Я знаю, что этот пример надуманный, но у меня есть приложение, в котором было бы очень полезно, если бы при перегрузке оператора класс, для которого я определяю оператор, мог появиться в правой части оператора. Возможно ли это в Python?

Ваш Ответ

2   ответа
12

__radd__, Также,нет ни одного за__le__(), __ge__()и т.д., но, как справедливо замечает Джоэл Корнетт, если вы определяете только__lt__, a > b вызывает__lt__ функцияb, который обеспечивает обходной путь.

>>> class My_Num(object):
...     def __init__(self, val):
...         self.val = val
...     def __radd__(self, other_num):
...         if isinstance(other_num, My_Num):
...             return self.val + other_num.val
...         else:
...             return self.val + other_num
... 
>>> n1 = My_Num(1)
>>> n2 = 3
>>> 
>>> print n2 + n1
4
>>> print n1 + n2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'My_Num' and 'int'

Обратите внимание, что, по крайней мере, в некоторых случаях разумно сделать что-то вроде этого:

>>> class My_Num(object):
...     def __init__(self, val):
...         self.val = val
...     def __add__(self, other_num):
...         if isinstance(other_num, My_Num):
...             return self.val + other_num.val
...         else:
...             return self.val + other_num
...     __radd__ = __add__
Можно сравнивать в определенной степени правильное сравнение, контролируя, какие операторы определены для каждого класса. Если А и В имеют толькоlt определен, например. A & B и B> A вызовут метод, принадлежащий маленькому концу.
Благодарю. Являетсяradd единственный, который позволяет это? Конкретные операторы, которые мне нужно перегрузить для моего приложения, это & gt; & gt; и & lt; & lt; операторы. Мне просто не повезло, я хочу сделать это для тех операторов? martega
Есть ли способ изменить ассоциативность оператора? Например, могу ли я сделать & gt; & gt; оператор справа ассоциативный? martega
@martega,thatЯhighly сомнения. Но я на самом деле не знаю.
Нету. Вы нажали на ссылку? Там & APOS; s__rrshift__, и так далее.
1

__radd__ метод (правостороннее сложение). Ваша функция должна выглядеть примерно так же, как ваша__add__ метод, например:

def __radd__(self, other):
     return self.val + other.val

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