Найти - Пользователи
Полная версия: как создаётся объект числа?
Начало » Python для новичков » как создаётся объект числа?
1 2
zlodiak
помогите пожалуйста понять какой магический метод срабатывает когда я пытаюсь вывести объект в следующем виде:

 class Number:
	def __init__(self, start):
		self.data = start
x = Number(5)
print(x)

Я понимаю ситуацию так.

  • 1. число, как и всё остальное в питоне является объектом
    2. когда я создаю экземпляр класса, я передаю в его конструктор 5
    3. конструктор записывает эту пятёрку в какой-то свойство(какое у него имя?? в моём примере это self.data , но оно не обязательно может так называться)
    4. при выводе объекта (print(x)) срабатывает какой-то встроенный метод наподобие __str__(), но в отличие от str возвращается не строка, а именно число. что это за метод?
PEHDOM
zlodiak
но в отличие от str возвращается не строка, а именно число.
боюсь разочаровать, но возвращаеться таки строка.
zlodiak
срабатывает какой-то встроенный метод наподобие __str__()… что это за метод?
срабатывает таки __str__(), и возвращает оно строку.
zlodiak
PEHDOM
срабатывает таки __str__(), и возвращает оно строку.

спасибо за ответ. но как же в таком случае в выражении Y = X - 2 из строки вычитается число?…

 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)

такое разве возможно?..
PEHDOM
zlodiak
как же в таком случае в выражении Y = X - 2 из строки вычитается число?
почему вы решили что число вычитаеться из строки? у вас же четко написано :
return Number(self.data - other)
метод __str__() вызываеться функциями srt() print() и format() где у вас хоть одна из этих функций?
Rodegast
> срабатывает таки __str__(), и возвращает оно строку.

Двойка тебе. print конечно же дёргает __str__, но REPL и отладчики его не воспринимают. По этому нужно переопределять не __str__, а __repr__.
https://habr.com/ru/sandbox/82471/
PEHDOM
Rodegast
Двойка тебе. print конечно же дёргает __str__, но REPL и отладчики его не воспринимают.
причем тут отладчик? ТС явно спросил
zlodiak
при выводе объекта (print(x)) срабатывает какой-то встроенный метод …. что это за метод?
то что __str__ может в свою очередь дергать еще туеву хучу методов в том числе и __repr__ к вопросу не относится.
py.user.next
Всё можно проверить логически, если чего-то не знаешь
  
>>> class A:
...     
...     def __str__(self):
...         return 'str a'
...     
...     def __repr__(self):
...         return 'repr a'
... 
>>> print(A())
str a
>>> A()
repr a
>>>
Rodegast
> то что __str__ может в свою очередь дергать еще туеву хучу методов в том числе и __repr__ к вопросу не относится.

Если __str__ не определён, то эти методы будут дёргать __repr__
 >>> class tst:
...     def __repr__(self): return "tst"
...
>>> tst()
tst
>>> str(tst())
'tst'
>>> print(tst())
tst
>>> format(tst())
'tst'
PEHDOM
Rodegast
Если __str__ не определён, то эти методы будут дёргать __repr__
Естевенно, но это уже частности, если уж быть до конца занудой,то принт вызовет __str__(), поскольку он не переопределен то вызоветься __str__ унаследованый от родителя, который вызовет уже __repr__ а если и __repr__ не переопределен то взовется унаследованый __repr__ и оно вообще выдаст чтото типа такого
<__main__.tst object at 0x02C53810>
но первоначально вызываеться именно __str__(), все остальное уже следствие того что там понаписано внутри __str__()…
Rodegast
> но первоначально вызываеться именно __str__(), все остальное уже следствие того что там понаписано внутри __str__

Какая разница как оно вызывается? __repr__ возвращает строковое представление объекта, а переопределять __str__ нужно только в том случае если необходимо иметь отдельное представление для пользователя (например выводить ему дополнительную информацию, улучшить читаемость, сделать перевод на его родной язык и т.п.).
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