Найти - Пользователи
Полная версия: Метод def __str__ чем вызывается?
Начало » Python для новичков » Метод def __str__ чем вызывается?
1 2
Franek
Подскажите, пожалуйста, чем вызывается здесь метод def __str__ ?

 class Critter(object):
    def __init__(self, name):
        print("A new critter has been born!")
        self.name = name
    def __str__(self):
        rep = "Critter object\n"
        rep += "name: " + self.name + "\n"
        return rep  
    def talk(self):
        print("Hi.  I'm", self.name, "\n")
# main
crit1 = Critter("Poochie")
crit1.talk()
crit2 = Critter("Randolph")
crit2.talk()
print("Printing crit1:")
print(crit1)
4kpt_IV
Franek
print(crit1)
py.user.next
Функция str() вызывает этот метод, а сама функция str() вызывается неявно.
Franek
4kpt_IV
py.user.next
Спасибо!
Подскажите, ещё. Хочу чтобы на экране отобразились числовые значения в виде строки. Почему возникает ошибка о том, что “возвращается не строка”?
 class Critter(object):
    def __init__(self, name, hunger = 0, boredom = 0):
        self.name = name
        self.hunger = hunger
        self.boredom = boredom
    def __str__(self):
        h = crit.hunger
        b = crit.boredom
        h = str(h)
        b = str(b)
        return h, b
crit = Critter("Boby")
print(crit)
TypeError: __str__ returned non-string (type tuple)
Franek
Разобрался. Оказывается, дело было в команде Return (нельзя было писать возвращаемые значения через запятую).
Как сделать, чтобы Return возвращала оба значения, каждую с новой стркои? И h и b?
Stepan_M
Вроде она и возвратила оба. В таком виде вы возвращаете кортеж:
Franek
TypeError: __str__ returned non-string (type tuple)
Потому что
 return h, b
соответствует
 return (h, b)
Другое дело, что print, видимо, не может в таком виде его распечатать (returned non-string)
Franek
Как сделать, чтобы Return возвращала оба значения, каждую с новой стркои? И h и b?
Если нужно, чтобы было возвращено две строки с какими-то данными, я бы переписал __str__ так:
 def __str__(self):
    return str(crit.hunger) + "\n" + str(crit.boredom)
Franek
Stepan_M
спасибо, работает.
py.user.next
  
>>> class Critter:
...     
...     def __init__(self, name, hunger=0, boredom=0):
...         self.name = name
...         self.hunger = hunger
...         self.boredom = boredom
...     
...     def __str__(self):
...         return '[{} {}]'.format(self.hunger, self.boredom)
... 
>>> crit = Critter('Boby')
>>> print(crit)
[0 0]
>>> 
Romissevd
     def __str__(self):
        h = crit.hunger
        b = crit.boredom
Что такое crit.hunger? А если не изменяя класса создать экземпляр с именем, допустим pat?
Franek
Romissevd
Не понял, зачем?
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