Найти - Пользователи
Полная версия: Методы перегрузка операторов
Начало » Python для новичков » Методы перегрузка операторов
1
Maksim
Вопрос про методы перегрузки операторов в классах. Каким образом интерпретатор 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) # создаем экземпляр класса

Теперь если ввести выражение X+1 ответом будет - 2. Т.е как я понимаю интерпретатор перехватывает выражение + и вызывает метод экземпляра X - __add__ . Но метод __add__ перегрузки есть и у числа 1. Если интерпретатор вызывает метод перегрузки именно левого аргумента (т.е X), то почему если ввести выражение 1+X, метод __add__ будет перегружен у экземпляра X (т.е объекта справа )?
Singularity
Когда ты складываешь сначала вызывается add левого числа (обджекта) если его нет или он упал (вроде), то вызывается radd правого.
Префикс r каг-бе намекает.
Maksim
Singularity
Допустим имеется переменная a = 1. Почему тогда в выражении a + X, метод __add__ не вызывается у переменной a? ведь он там тоже имеется
py.user.next
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
>>>
d3z0x77+rsmqbc
Maksim
Ответ на твой вопрос в книге Марк Лутц - Изучаем Python (3 издание, 2009 год) на странице 619
Singularity
Maksim
SingularityДопустим имеется переменная a = 1. Почему тогда в выражении a + X, метод __add__ не вызывается у переменной a? ведь он там тоже имеется
В типа int не определены эти методы __add__ __radd__
py.user.next
Singularity
В типа int не определены эти методы __add__ __radd__
>>> (1).__add__
<method-wrapper '__add__' of int object at 0x355b44e7e0>
>>> (1).__radd__
<method-wrapper '__radd__' of int object at 0x355b44e7e0>
>>>
Maksim
Singularity
Методы все таки имеются!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB