Форум сайта python.su
0
Вопрос про методы перегрузки операторов в классах. Каким образом интерпретатор Python выбирает в каком объекте использовать метод перегрузки? Допусим имеется класс:
class a: def __init__(self, other): self.data = other def __add__(self, other): return self.data + other def __radd__(self,other): return self.data + other X = a(1) # создаем экземпляр класса
Офлайн
75
Когда ты складываешь сначала вызывается add левого числа (обджекта) если его нет или он упал (вроде), то вызывается radd правого.
Префикс r каг-бе намекает.
Офлайн
0
Singularity
Допустим имеется переменная a = 1. Почему тогда в выражении a + X, метод __add__ не вызывается у переменной a? ведь он там тоже имеется
Отредактировано Maksim (Фев. 14, 2014 20:00:39)
Офлайн
857
http://docs.python.org/3/reference/datamodel.html#object.__radd__
These functions are only called if the left operand does not support the corresponding operation and the operands are of different types.
>>> class A: ... x = 1 ... def __add__(self, n): ... print('l') ... return self.x + n ... def __radd__(self, n): ... print('r') ... return self.x + n ... >>> a = A() >>> a + 1 l 2 >>> 1 + a r 2 >>> (1).__add__(a) NotImplemented >>>
Офлайн
0
Maksim
Ответ на твой вопрос в книге Марк Лутц - Изучаем Python (3 издание, 2009 год) на странице 619
Офлайн
75
MaksimВ типа int не определены эти методы __add__ __radd__
SingularityДопустим имеется переменная a = 1. Почему тогда в выражении a + X, метод __add__ не вызывается у переменной a? ведь он там тоже имеется
Офлайн
857
Singularity
В типа int не определены эти методы __add__ __radd__
>>> (1).__add__ <method-wrapper '__add__' of int object at 0x355b44e7e0> >>> (1).__radd__ <method-wrapper '__radd__' of int object at 0x355b44e7e0> >>>
Офлайн
0
Singularity
Методы все таки имеются!
Офлайн