Как применить функцию __str__ при печати списка объектов в Python

Ну, этот интерактивный фрагмент консоли python расскажет все:

>>> class Test:
...     def __str__(self):
...         return 'asd'
...
>>> t = Test()
>>> print(t)
asd
>>> l = [Test(), Test(), Test()]
>>> print(l)
[__main__.Test instance at 0x00CBC1E8, __main__.Test instance at 0x00CBC260,
 __main__.Test instance at 0x00CBC238]

В основном я хотел бы получить три строки asd, напечатанную при печати списка. Я также пробовал pprint, но он дает те же результаты.

Ответы

Ответ 1

Try:

class Test:
   def __repr__(self):
       return 'asd'

И прочитайте ссылку :

Ответ 2

Предложение в других ответах на реализацию __repr__ - определенно одна возможность. Если это невозможно по какой-либо причине (существующий тип, __repr__, необходимый по причинам, отличным от эстетического, и т.д.), Просто выполните

print [str(x) for x in l]

или, как утверждают некоторые, map(str, l) (чуть более компактный).

Ответ 3

Вам нужно сделать метод __repr__:

>>> class Test:
    def __str__(self):
        return 'asd'
    def __repr__(self):
        return 'zxcv'


>>> [Test(), Test()]
[zxcv, zxcv]
>>> print _
[zxcv, zxcv]

Обратитесь к docs:

object.__repr__(self)

Вызывается встроенной функцией repr() и строковыми преобразованиями (обратными кавычками) для вычисления "официального" строкового представления объекта. Если это вообще возможно, это должно выглядеть как действительное выражение Python, которое может быть использовано для воссоздания объекта с тем же значением (с учетом соответствующей среды). Если это невозможно, следует вернуть строку формы <...some useful description...>. Возвращаемое значение должно быть строковым. Если класс определяет __repr__(), но не __str__(), тогда __repr__() также используется, когда требуется "неформальное" строковое представление экземпляров этого класса.

Это обычно используется для отладки, поэтому важно, чтобы представление было информативным и недвусмысленным.