Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 31, 2019 21:49:11

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

как создаётся объект числа?

помогите пожалуйста понять какой магический метод срабатывает когда я пытаюсь вывести объект в следующем виде:

 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 возвращается не строка, а именно число. что это за метод?

Отредактировано zlodiak (Янв. 31, 2019 21:52:27)

Офлайн

#2 Янв. 31, 2019 22:47:02

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

как создаётся объект числа?

zlodiak
но в отличие от str возвращается не строка, а именно число.
боюсь разочаровать, но возвращаеться таки строка.
zlodiak
срабатывает какой-то встроенный метод наподобие __str__()… что это за метод?
срабатывает таки __str__(), и возвращает оно строку.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Янв. 31, 2019 22:48:15)

Офлайн

#3 Янв. 31, 2019 22:51:42

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

как создаётся объект числа?

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)

такое разве возможно?..

Офлайн

#4 Янв. 31, 2019 23:00:38

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

как создаётся объект числа?

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



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#5 Фев. 1, 2019 10:15:27

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

как создаётся объект числа?

> срабатывает таки __str__(), и возвращает оно строку.

Двойка тебе. print конечно же дёргает __str__, но REPL и отладчики его не воспринимают. По этому нужно переопределять не __str__, а __repr__.
https://habr.com/ru/sandbox/82471/



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Фев. 1, 2019 10:17:19)

Офлайн

#6 Фев. 1, 2019 10:54:28

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

как создаётся объект числа?

Rodegast
Двойка тебе. print конечно же дёргает __str__, но REPL и отладчики его не воспринимают.
причем тут отладчик? ТС явно спросил
zlodiak
при выводе объекта (print(x)) срабатывает какой-то встроенный метод …. что это за метод?
то что __str__ может в свою очередь дергать еще туеву хучу методов в том числе и __repr__ к вопросу не относится.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Фев. 1, 2019 11:00:36)

Офлайн

#7 Фев. 1, 2019 11:39:40

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

как создаётся объект числа?

Всё можно проверить логически, если чего-то не знаешь

  
>>> class A:
...     
...     def __str__(self):
...         return 'str a'
...     
...     def __repr__(self):
...         return 'repr a'
... 
>>> print(A())
str a
>>> A()
repr a
>>>



Офлайн

#8 Фев. 1, 2019 11:50:50

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

как создаётся объект числа?

> то что __str__ может в свою очередь дергать еще туеву хучу методов в том числе и __repr__ к вопросу не относится.

Если __str__ не определён, то эти методы будут дёргать __repr__

 >>> class tst:
...     def __repr__(self): return "tst"
...
>>> tst()
tst
>>> str(tst())
'tst'
>>> print(tst())
tst
>>> format(tst())
'tst'



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#9 Фев. 1, 2019 12:06:07

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

как создаётся объект числа?

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



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#10 Фев. 1, 2019 19:53:56

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

как создаётся объект числа?

> но первоначально вызываеться именно __str__(), все остальное уже следствие того что там понаписано внутри __str__

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



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version