Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 14, 2014 18:35:47

Maksim
Зарегистрирован: 2013-01-09
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Методы перегрузка операторов

Вопрос про методы перегрузки операторов в классах. Каким образом интерпретатор 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 (т.е объекта справа )?

Офлайн

#2 Фев. 14, 2014 19:31:43

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Методы перегрузка операторов

Когда ты складываешь сначала вызывается add левого числа (обджекта) если его нет или он упал (вроде), то вызывается radd правого.
Префикс r каг-бе намекает.

Офлайн

#3 Фев. 14, 2014 19:56:40

Maksim
Зарегистрирован: 2013-01-09
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Методы перегрузка операторов

Singularity
Допустим имеется переменная a = 1. Почему тогда в выражении a + X, метод __add__ не вызывается у переменной a? ведь он там тоже имеется

Отредактировано Maksim (Фев. 14, 2014 20:00:39)

Офлайн

#4 Фев. 14, 2014 20:07:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Методы перегрузка операторов

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
>>>



Офлайн

#5 Фев. 14, 2014 20:11:39

d3z0x77+rsmqbc
Зарегистрирован: 2014-01-21
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

Методы перегрузка операторов

Maksim
Ответ на твой вопрос в книге Марк Лутц - Изучаем Python (3 издание, 2009 год) на странице 619

Офлайн

#6 Фев. 14, 2014 20:17:01

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Методы перегрузка операторов

Maksim
SingularityДопустим имеется переменная a = 1. Почему тогда в выражении a + X, метод __add__ не вызывается у переменной a? ведь он там тоже имеется
В типа int не определены эти методы __add__ __radd__

Офлайн

#7 Фев. 14, 2014 20:21:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Методы перегрузка операторов

Singularity
В типа int не определены эти методы __add__ __radd__
>>> (1).__add__
<method-wrapper '__add__' of int object at 0x355b44e7e0>
>>> (1).__radd__
<method-wrapper '__radd__' of int object at 0x355b44e7e0>
>>>



Офлайн

#8 Фев. 14, 2014 21:28:28

Maksim
Зарегистрирован: 2013-01-09
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Методы перегрузка операторов

Singularity
Методы все таки имеются!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version