Форум сайта python.su
Добрый день.
В программировании я новичек.
(сам верстальщик сайтов)
Сейчас изучаю один учебник по питону и возник момент непонимания у меня с классами
я так понимаю(из логики результата кода на скрине) что переменная f1 подставляется в параметр self(метода __add_) а переменная f2 подставляется в параметр otherfraction..?
Вопрос:
Каким образом программа(интерпретатор) понимает, что эти переменные должны подставлятся именно в данные параметры??
(по каким признакам это можно понять?)
P.S. Буду благодарен за любые +- конструктивные мысли по поводу данного вопроса..
Отредактировано Mike_Kharkov (Окт. 8, 2015 21:48:35)
Офлайн
Mike_Kharkov
Каким образом программа(интерпретатор) понимает, что эти переменные должны подставлятся именно в данные параметры??
(по каким признакам это можно понять?)
Офлайн
ayb
Так в тексте прямо написано : вызов f1 + f2 аналогичен вызову f1.__add__(f2).
Отредактировано Mike_Kharkov (Окт. 8, 2015 22:13:31)
Офлайн
Смотрим в сторону __radd__ вопрос отвалится сам собой…
Офлайн
self это ссылка на экземпляр класса. Вы вызываете метод объекта f1. В любом методе объекта f1 первым аргументом будет сам f1.
Офлайн
В общем тогда я всеравно ниче не понял. ) (как метод __add__(и вообще любые другие методы в сочитании с классами) функционирует имею ввиду.)
Если кто предоставит ссылку где по полочкам бы подобная ситуация разбиралась - буду очень признателен..
(имею ввиду механику интерпретатора словно это дебаггер был бы.
В книге тоже есть дебаггер встроенный - но когда код помещаю туда он(код) вообще не работает - ошибку выдает..)
P.S. О методе __radd__ я тоже почитал но мне это не дало ничего в плане понимания.. )
Отредактировано Mike_Kharkov (Окт. 9, 2015 00:00:33)
Офлайн
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 >>>
Офлайн
__add__ и __radd__ оперирует объектом основным (к которому прибавляется) и дополнительным (который прибавляется). Разница в том, каким слагаемым (с какой конкретно стороны) находится тот объект, для которого прописывается это поведение. Если __add__ то объект + что_то_еще. Если __radd__ то что_то_еще + объект. Что-то еще становится other.
Блин. Как лень писать. Киньте скайп поясню подробнее. Что-то навалилась охота вспомнить преподавание…
Офлайн
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 на пример?
(в этом и заключается мой главный вопрос по сути.)
Отредактировано py.user.next (Окт. 9, 2015 06:41:53)
Офлайн
Народ!
Такой вопрос:
Где(и главное как) можно научиться дебажить код?
Установил себе редактор эклипс с плагином 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” и слово “текст” соответственно) - но после этого добится такого же отображения результата(во время дебажа) на этой строке мне не удается..
Почему?? )
В общем моя цель это научиться видеть значения разных переменных(параметров, аргументов и т.д. и т.п.) во время исполнения кода(в той или иной строчке..)
Без этого чувствую очень сложно будет понять логику(детальный механизм) алгоритмов той или иной программы..
(Придеться каждый раз спрашивать на форумах(+ у знакомых) о каждой мелочи в плане механизма работы программ, а мне это не нужно. Хотелось бы самомму научиться разбираться с проблемами.(по крайней мере базового характера..))
Что можите посоветовать? )
За примеры Всем большое спасибо!
Очень наглядно - я все понял моментально..
Отредактировано Mike_Kharkov (Окт. 13, 2015 10:57:06)
Офлайн