2010-08-24 3 views
18

Ну это интерактивный питон консоль сниппает расскажет все:Как применять __str__ функции при печати списка объектов в 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, но он дает те же результаты.

ответ

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__() также используется, когда требуется «неформальное» строковое представление экземпляров этого класса.

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

+0

Из документации, представленной в ответе, кажется, что мне не нужно определение __str__, если используется __repr__. Спасибо за ваш вклад. – dvim

+1

@Blink_: Это зависит от того, что именно вы хотите. Используя класс, который я определил, сравните вывод 'print Test()' с 'print [Test()]'. –

9

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

print [str(x) for x in l] 

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

Смежные вопросы