Найти - Пользователи
Полная версия: Метод __add__ и возврат функции..
Начало » Python для новичков » Метод __add__ и возврат функции..
1 2
Mike_Kharkov
Добрый день.
В программировании я новичек.
(сам верстальщик сайтов)

Сейчас изучаю один учебник по питону и возник момент непонимания у меня с классами


я так понимаю(из логики результата кода на скрине) что переменная f1 подставляется в параметр self(метода __add_) а переменная f2 подставляется в параметр otherfraction..?

Вопрос:
Каким образом программа(интерпретатор) понимает, что эти переменные должны подставлятся именно в данные параметры??
(по каким признакам это можно понять?)

P.S. Буду благодарен за любые +- конструктивные мысли по поводу данного вопроса..
ayb
Mike_Kharkov
Каким образом программа(интерпретатор) понимает, что эти переменные должны подставлятся именно в данные параметры??
(по каким признакам это можно понять?)

Так в тексте прямо написано : вызов f1 + f2 аналогичен вызову f1.__add__(f2).
Mike_Kharkov
ayb
Так в тексте прямо написано : вызов f1 + f2 аналогичен вызову f1.__add__(f2).

Это я понимаю.
Но для того что бы вычислить все эти дробные значения между ними - необходимо же что бы и f1 и f2 подставились в параметры self и otherfraction.
Правильно я понимаю?
Если да - то как self “понимает” что он “должен” принять значение f1 именно а не f2 на пример?
(в этом и заключается мой главный вопрос по сути.)
4kpt_III
Смотрим в сторону __radd__ вопрос отвалится сам собой…
ayb
self это ссылка на экземпляр класса. Вы вызываете метод объекта f1. В любом методе объекта f1 первым аргументом будет сам f1.
Mike_Kharkov
В общем тогда я всеравно ниче не понял. ) (как метод __add__(и вообще любые другие методы в сочитании с классами) функционирует имею ввиду.)
Если кто предоставит ссылку где по полочкам бы подобная ситуация разбиралась - буду очень признателен..
(имею ввиду механику интерпретатора словно это дебаггер был бы.
В книге тоже есть дебаггер встроенный - но когда код помещаю туда он(код) вообще не работает - ошибку выдает..)


P.S. О методе __radd__ я тоже почитал но мне это не дало ничего в плане понимания.. )

JOHN_16
Mike_Kharkov
МОжет на примере вам станет яснее? и да, не надо думать о том как сильно это внутри работает (на уровне дебаггера), рано еще вам.
Суть в том если есть операция сложения между некими объектами A и B, то благодаря тому как реализован полиморфизм в Python, эти два объекта, не важно какие они, могут быть сложены между собой , если эти объекты предоставляют дя этого “магические” методы __add__ и __radd__. Почему их 2? Ну я точно не отвечу. но суть в том что с точки зрения объекта А выражения A+B и B+A не равны (и даже значения могут получаться разные, если объект запрограммирован на какое то по особому).
Теперь о примере ниже. В случае выражения A+2, т.е. объект слева, объект обязан предоставить метод __add__, в случае если выражение 2+A, т.е. объект справа, объект обязан предоставить метод __radd__. Более наглядно наверное это будет понято если вы пооработаете с аналогичным методом __sub__ который реализует вычитание.
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class A(object):
...     def __init__(self, value):
...         self.value = value
...     def __add__(self, value):
...          return self.value + value
...
>>> a= A(10)
>>>
>>> a+10
20
>>> 10+a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'A'
>>>
>>> class B(A):
...     def __radd__(self, value):
...          return self.value + value
...
>>> b=B(10)
>>> b+2
12
>>> 2+b
12
>>>
4kpt_III
__add__ и __radd__ оперирует объектом основным (к которому прибавляется) и дополнительным (который прибавляется). Разница в том, каким слагаемым (с какой конкретно стороны) находится тот объект, для которого прописывается это поведение. Если __add__ то объект + что_то_еще. Если __radd__ то что_то_еще + объект. Что-то еще становится other.

Блин. Как лень писать. Киньте скайп поясню подробнее. Что-то навалилась охота вспомнить преподавание…
py.user.next
Mike_Kharkov
В общем тогда я всеравно ниче не понял.
Ты запутался, потому что пытаешься понять простую вещь на не самом удачном примере.

Замена операции сложения для обычной строки:
>>> class Str(str):
...     
...     def __add__(self, value):
...         return '|'.join((self * 2, Str(value) * 3))
... 
>>> s = Str('text')
>>> s
'text'
>>> s + 'x'
'texttext|xxx'
>>> s + 1
'texttext|111'
>>> s + [1, 2, 3]
'texttext|[1, 2, 3][1, 2, 3][1, 2, 3]'
>>> s + s
'texttext|texttexttext'
>>>


Mike_Kharkov
Если да - то как self “понимает” что он “должен” принять значение f1 именно а не f2 на пример?
(в этом и заключается мой главный вопрос по сути.)

Когда интерпретатор видит операцию +, он берёт часть слева от неё и часть справа от неё.
Объект, взятый слева, имеет переопределённый метод левого сложения, поэтому сложение выполняется с помощью обнаруженного метода.
Метод объекта принимает сам объект, у которого он вызывается, и аргумент.
Левая часть обрабатываемой операции + привязывается к self, а правая - ко втором аргументу.
Mike_Kharkov
Народ!
Такой вопрос:
Где(и главное как) можно научиться дебажить код?
Установил себе редактор эклипс с плагином pydev но че то вьехать вообще не могу в механизмы отладки..
Посмотрел вот этот ролик:
https://www.youtube.com/watch?v=czeWze5fWZY&list=FLEJPEu8b8La–oNfDWWBESA&index=1
Но видимо версия старая там в нем редактора и у меня вообще некоторых ф-ций нет..
В инете ничего вообще не могу найти в смыле уроков для чайников по отладке..
Есть какие нибудь источники(бесплатные) на сегодняшний день в этом плане??

P.S. Пример проблемы которая меня в ступор вводит:
https://yadi.sk/i/n7n_ZZFRjh8W5
Хочу посмотреть значения в 3-й строке во время выполнения кода - но в графе переменные вообще ничего не показывает!?.. )
Как такое возможно? )
Должно же быть хоть что то? )
(+ пишется еще: “pydev debugger: starting (pid: 16776)” - тоже не понятно что это - нагуглить не удается. Пока есть версия что это ошибка возможно какая то..)

1 раз случайно нажал что то и увидел(в значениях 3-й строки) в графе с переменными(там где знак вопроса сейчас) значения переменной self и value (переменная “S” и слово “текст” соответственно) - но после этого добится такого же отображения результата(во время дебажа) на этой строке мне не удается..
Почему?? )

В общем моя цель это научиться видеть значения разных переменных(параметров, аргументов и т.д. и т.п.) во время исполнения кода(в той или иной строчке..)
Без этого чувствую очень сложно будет понять логику(детальный механизм) алгоритмов той или иной программы..
(Придеться каждый раз спрашивать на форумах(+ у знакомых) о каждой мелочи в плане механизма работы программ, а мне это не нужно. Хотелось бы самомму научиться разбираться с проблемами.(по крайней мере базового характера..))
Что можите посоветовать? )



За примеры Всем большое спасибо!
Очень наглядно - я все понял моментально..
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