Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 8, 2015 21:06:19

Mike_Kharkov
Зарегистрирован: 2015-10-08
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Метод __add__ и возврат функции..

Добрый день.
В программировании я новичек.
(сам верстальщик сайтов)

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


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

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

P.S. Буду благодарен за любые +- конструктивные мысли по поводу данного вопроса..

Отредактировано Mike_Kharkov (Окт. 8, 2015 21:48:35)

Офлайн

#2 Окт. 8, 2015 21:59:38

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Метод __add__ и возврат функции..

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

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

Офлайн

#3 Окт. 8, 2015 22:11:10

Mike_Kharkov
Зарегистрирован: 2015-10-08
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Метод __add__ и возврат функции..

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

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

Отредактировано Mike_Kharkov (Окт. 8, 2015 22:13:31)

Офлайн

#4 Окт. 8, 2015 22:21:39

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Метод __add__ и возврат функции..

Смотрим в сторону __radd__ вопрос отвалится сам собой…

Офлайн

#5 Окт. 8, 2015 22:32:48

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Метод __add__ и возврат функции..

self это ссылка на экземпляр класса. Вы вызываете метод объекта f1. В любом методе объекта f1 первым аргументом будет сам f1.

Офлайн

#6 Окт. 8, 2015 23:21:39

Mike_Kharkov
Зарегистрирован: 2015-10-08
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Метод __add__ и возврат функции..

В общем тогда я всеравно ниче не понял. ) (как метод __add__(и вообще любые другие методы в сочитании с классами) функционирует имею ввиду.)
Если кто предоставит ссылку где по полочкам бы подобная ситуация разбиралась - буду очень признателен..
(имею ввиду механику интерпретатора словно это дебаггер был бы.
В книге тоже есть дебаггер встроенный - но когда код помещаю туда он(код) вообще не работает - ошибку выдает..)


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

Отредактировано Mike_Kharkov (Окт. 9, 2015 00:00:33)

Офлайн

#7 Окт. 9, 2015 00:25:01

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Метод __add__ и возврат функции..

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



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#8 Окт. 9, 2015 00:29:44

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Метод __add__ и возврат функции..

__add__ и __radd__ оперирует объектом основным (к которому прибавляется) и дополнительным (который прибавляется). Разница в том, каким слагаемым (с какой конкретно стороны) находится тот объект, для которого прописывается это поведение. Если __add__ то объект + что_то_еще. Если __radd__ то что_то_еще + объект. Что-то еще становится other.

Блин. Как лень писать. Киньте скайп поясню подробнее. Что-то навалилась охота вспомнить преподавание…

Офлайн

#9 Окт. 9, 2015 06:30:12

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

Метод __add__ и возврат функции..

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, а правая - ко втором аргументу.



Отредактировано py.user.next (Окт. 9, 2015 06:41:53)

Офлайн

#10 Окт. 13, 2015 02:31:38

Mike_Kharkov
Зарегистрирован: 2015-10-08
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Метод __add__ и возврат функции..

Народ!
Такой вопрос:
Где(и главное как) можно научиться дебажить код?
Установил себе редактор эклипс с плагином 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)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version