Форум сайта python.su
0
помогите пожалуйста понять какой магический метод срабатывает когда я пытаюсь вывести объект в следующем виде:
class Number: def __init__(self, start): self.data = start x = Number(5) print(x)
Отредактировано zlodiak (Янв. 31, 2019 21:52:27)
Офлайн
294
zlodiakбоюсь разочаровать, но возвращаеться таки строка.
но в отличие от str возвращается не строка, а именно число.
zlodiakсрабатывает таки __str__(), и возвращает оно строку.
срабатывает какой-то встроенный метод наподобие __str__()… что это за метод?
[code python][/code]
Отредактировано PEHDOM (Янв. 31, 2019 22:48:15)
Офлайн
0
PEHDOM
срабатывает таки __str__(), и возвращает оно строку.
class Number: def __init__(self, start): self.data = start def __sub__(self, other): return Number(self.data - other) X = Number(5) Y = X - 2 print(Y.data)
Офлайн
294
zlodiakпочему вы решили что число вычитаеться из строки? у вас же четко написано :
как же в таком случае в выражении Y = X - 2 из строки вычитается число?
[code python][/code]
Офлайн
186
> срабатывает таки __str__(), и возвращает оно строку.
Двойка тебе. print конечно же дёргает __str__, но REPL и отладчики его не воспринимают. По этому нужно переопределять не __str__, а __repr__.
https://habr.com/ru/sandbox/82471/
Отредактировано Rodegast (Фев. 1, 2019 10:17:19)
Офлайн
294
Rodegastпричем тут отладчик? ТС явно спросил
Двойка тебе. print конечно же дёргает __str__, но REPL и отладчики его не воспринимают.
zlodiakто что __str__ может в свою очередь дергать еще туеву хучу методов в том числе и __repr__ к вопросу не относится.
при выводе объекта (print(x)) срабатывает какой-то встроенный метод …. что это за метод?
[code python][/code]
Отредактировано PEHDOM (Фев. 1, 2019 11:00:36)
Офлайн
857
Всё можно проверить логически, если чего-то не знаешь
>>> class A: ... ... def __str__(self): ... return 'str a' ... ... def __repr__(self): ... return 'repr a' ... >>> print(A()) str a >>> A() repr a >>>
Офлайн
186
> то что __str__ может в свою очередь дергать еще туеву хучу методов в том числе и __repr__ к вопросу не относится.
Если __str__ не определён, то эти методы будут дёргать __repr__
>>> class tst: ... def __repr__(self): return "tst" ... >>> tst() tst >>> str(tst()) 'tst' >>> print(tst()) tst >>> format(tst()) 'tst'
Офлайн
294
RodegastЕстевенно, но это уже частности, если уж быть до конца занудой,то принт вызовет __str__(), поскольку он не переопределен то вызоветься __str__ унаследованый от родителя, который вызовет уже __repr__ а если и __repr__ не переопределен то взовется унаследованый __repr__ и оно вообще выдаст чтото типа такого
Если __str__ не определён, то эти методы будут дёргать __repr__
<__main__.tst object at 0x02C53810>
[code python][/code]
Офлайн
186
> но первоначально вызываеться именно __str__(), все остальное уже следствие того что там понаписано внутри __str__
Какая разница как оно вызывается? __repr__ возвращает строковое представление объекта, а переопределять __str__ нужно только в том случае если необходимо иметь отдельное представление для пользователя (например выводить ему дополнительную информацию, улучшить читаемость, сделать перевод на его родной язык и т.п.).
Офлайн