class Commuter5:
def __init__(self, val):
self.value = val
def __add__(self, other):
return Commuter5(self.value + other)
def __radd__(self, x):
return Commuter5(self.value + x)
def __str__(self):
return '<Commuter: %s>' % self.value
x = Commuter5(10)
y = Commuter5(20)
z = x + y
print(z)
Недавно начал изучать ООП. Помогите разобраться в этом примере. Мне нужно знать, как это вообще работает. Исправлять ничего не нужно. Я хочу понять принцип. С одной стороны - код понятный и не сложный, но когда я начал смотреть это в debugger, то некоторый момент очень сильно смутили. Если кому не сложно, то пожалуйста, проверьте код на debugger, и объясните.
На сколько я понял(и как показывает в debugger) когда идет z = x + y, то Python пытается сложить сначала внутри метода __add__, self.value, который равен 10, и other,который равен объекту класса . Метод __add__ , как мне известно - не будет это отрабатывать, потому что метод __add__ сработает только, если будет <объект класса> + <число>, крч чтобы объект числа был справа. (
тут мне еще момент не понятен, если выше сказанное верно, то почему Python сразу не пошел в метод __radd__ мне не понятно, но да ладно. Если не сложно, объясните и этот момент). Когда в методе __add__ появляется такое выражение, то насколько я понял, Python отправляет это все в метод __radd__, чтобы он отработал этот момент, и там все это успешно происходит, и вот после этого момент для меня начинается полная тьма!!!! Что тут сделала конструкция внутри метода __radd__, а именно 'return Commuter5(self.value + x)' ??. Как показывает debugger - Python снова идет внутрь метода __init__, и там как я понял инициализируется какой-то объект(
как мне известно __init__ служит для инициализации объектов класса. Что инициализируется внутри __init__ ,,?? там появляется вот такая запись self: <__main__.Commuter5 object at 0x000001C54CA967D0> val:30)Внимание: все это происходит в Pycharm. Если метод __init__ что-то инициализировал, то где это хранится? по идее же в каком-то экземпляре класса? или я что-то не понимаю? Дальше вообще полный трешь творится. Python опять почему-то идет внутрь метода __radd__, и снова делает return Commuter5(self.value + x), потом идет внутрь __add__ и делает return Commuter5(self.value + other) не понятно почему и на сколько там видно - other по прежнему равен объекту класса