2013-07-04 5 views
0

Я фактически закончил это упражнение (почти), но просто застрял на крошечной проблеме с __str__, которая находится внутри объекта. Если я это сделатьПечать Python __str__ с объекта

elif choice == "9": 
    try: 
     for i in sworm: 
      print(i) 
    except TypeError: 
     None` 

Тогда это будет только распечатать детали первого объекта в моем списке (только 2 объекта есть) например - sworm = [crit,crit1]

Когда я попробовал этот

elif choice == "9": 
    try: 
     print(sworm) 
    except TypeError: 
     None 

Тогда я получаю: -

[<__main__.Critter object at 0x02B54AD0>, <__main__.Critter object at 0x02B5B190>] 

Вот первая половина моего объекта

class Critter(object): 
    """A virtual pet""" 
    def __init__(self, name, hunger = random.randint(1,50), boredom = random.randint(1,50)): 
     self.name = name 
     self.hunger = hunger 
     self.boredom = boredom 



    def __pass_time(self): 
     self.hunger += 1 
     self.boredom += 1 

    def __str__(self): 

     print ("Critter object\n") 
     print (self.name) 
     print (self.hunger) 
     print (self.boredom) 

Заранее спасибо.

+0

Это не по теме, но обратите внимание, что ваши аргументы конструктора будут оцениваться только один раз, а не при каждом создании экземпляра (см. Http://docs.python-guide.org/en/latest/writing/gotchas.html # mutable-default-arguments) – justinas

ответ

2

Список Python всегда показывает содержание как изображения, вызывая repr() на объектах.

Вы можете подключиться к этому, указав метод __repr__. С другой стороны, не распечатывает список непосредственно, но только содержание:

for elem in sworm: 
    print(elem) 

или присоединяться к ним в виде длинной строки:

print(', '.join(map(str, sworm))) 

ли убедитесь, что вы на самом деле возвращает значение из вашего __str__ метод, хотя:

def __str__(self): 
    return "Critter object\n{}\n{}\n{}".format(self.name, self.hunger, self.boredom) 

, потому что это значениевозврата, который печатается print().

+0

То же самое происходит, первое решение вызывает такую ​​вещь [<__ main __. Объект Critter в 0x02B54AD0>, а второе решение печатает только один элемент. мне нужно сначала реализовать __repr__? –

+0

Я выполнил ваши инструкции, но на этот раз я удалил инструкцию try, и я получил этот «ожидаемый экземпляр str, int found» –

+0

@jimmyLight: вместо этого переключилось на форматирование строки, которое будет преобразовывать все аргументы в 'str()' при интерполяции. Один или несколько атрибутов 'self.' - это' int', и я не учитывал это. –

0

Проблема заключается в следующем:

print ("Critter object\n") 
    print (self.name) 
    print (self.hunger) 
    print (self.boredom) 

См, метод __str__ не должен фактически печати ничего. Вместо этого он должен вернуть то, что он хочет напечатать. Итак, вам нужно сделать, это:

return "Critter object\n\n" + self.name + '\n' + self.hunger + '\n' + self.boredom 
+0

Вот как я это сделал в первый раз, я просто попробовал еще раз с печатью (sworm), как мне рассказала книга, и она дает это [<__ main __. Объект Critter в 0x02B54AD0> –

3

Если вам нужен метод __str__ работать, то вы должны вернуть строку из него - что-то вроде этого

def __str__(self): 
    return 'Critter object: %s %s %s' %(self.name, self.hunger, self.boredom) 

Пожалуйста, прочитайте документацию here

+0

@MartijnPieters Well OP сказал, что у них была проблема с методом '__str__', и это выражение' return' отсутствует. Я думаю, это справедливо. – ersran9

+0

Да, вы правы; операторы 'print()' в '__str__' являются лучшим индикатором того, что происходит неправильно. –

0

Альтернативно, если вы не хотите жестко кодировать свои str, вы можете сделать это следующим образом:

def __str__(self): 
    return ', '.join(['{key}={value}'.format(key=key, value=self.__dict__.get(key)) for key in self.__dict__]) 
Смежные вопросы