Перегрузка оператора в python с помощью объекта в правой части оператора

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

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

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 

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

 n1 = My_Num(1) n2 = My_Num(2) n3 = 3 print n1 + n2 print n1 + n3 

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

 n1 = My_Num(1) n2 = 2 print 2 + n1 

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

2 Solutions collect form web for “Перегрузка оператора в python с помощью объекта в правой части оператора”

Да. Например, существует __radd__ . Кроме того, для __le__() , __ge__() и т. Д. __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__ 

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

 def __radd__(self, other): return self.val + other.val 
 
Interesting Posts for Van-Lav
Python - лучший язык программирования в мире.