В Java, если я вызываю List.toString (), он автоматически вызывает метод toString () для каждого объекта внутри List. Например, если мой список содержит объекты o1, o2 и o3, list.toString () будет выглядеть примерно так:
"[" + o1.toString() + ", " + o2.toString() + ", " + o3.toString() + "]"
Есть ли способ добиться аналогичного поведения в Python? Я реализовал в своем классе метод __str __ (), но когда я распечатываю список объектов, используя:
print 'my list is %s'%(list)
это выглядит примерно так:
[<__main__.cell instance at 0x2a955e95f0>, <__main__.cell instance at 0x2a955e9638>, <__main__.cell instance at 0x2a955e9680>]
как я могу заставить python автоматически вызывать мой __str__ для каждого элемента внутри списка (или dict в этом отношении)?
Ответы:
Строка вызова в списке Python вызывает
__repr__
метод для каждого элемента внутри. По некоторым пунктам__str__
и__repr__
одинаковы. Если вы хотите такого поведения, сделайте:источник
__str__
с__repr__
обычно не согласуется с моделью данных Python , поэтому решение для понимания списка, предложенное @ daniel-lew, более питонично.str()
список будет возвращенstr()
для каждого отдельного элемента внутри.Вы можете использовать понимание списка для автоматического создания нового списка с каждым элементом str () 'd:
источник
print(map(str, mylist))
- он немного корочеВы можете сделать две простые вещи: использовать
map
функцию или использовать понимание.Но это дает вам список строк, а не строку. Таким образом, вам также нужно соединить струны вместе.
или
Затем вы можете распечатать этот составной строковый объект.
источник
В зависимости от того, для чего вы хотите использовать этот вывод, возможно,
__repr__
будет более подходящим:источник
Я согласен с предыдущим ответом об использовании для этого списков, но вы, безусловно, можете скрыть это за функцией, если это то, что плавает ваша лодка.
Ради интереса я сделал list_str () рекурсивно str () для всего, что содержится в списке.
источник
__str__
и__repr__
отдельноЧто-то вроде этого?
источник
Этого должно хватить.
При печати списков, а также других классов контейнеров содержащиеся элементы будут напечатаны с использованием
__repr__
, потому что они__repr__
предназначены для использования для внутреннего представления объекта. Если мы позвоним:help(object.__repr__)
он скажет нам:И если мы вызовем,
help(repr)
он выведет:Если
__str__
реализован для объекта и__repr__
неrepr(obj)
будет выводить выходные данные по умолчанию, какprint(obj)
если бы они не были реализованы.Итак, единственный способ - реализовать
__repr__
для вашего класса. Один из возможных способов сделать это:источник
Вывод, который вы получаете, - это просто имя модуля объекта, имя класса, а затем адрес памяти в шестнадцатеричном формате, поскольку
__repr__
функция не переопределяется.__str__
используется для строкового представления объекта при использовании печати. Но поскольку вы печатаете список объектов, а не выполняете итерацию по списку для вызоваstr
метода для каждого элемента, он распечатывает представление объектов.Чтобы
__str__
функция вызывалась, вам нужно сделать что-то вроде этого:Если вы переопределите
__repr__
функцию, вы можете использовать метод печати, как и раньше:Тогда вы получите "
my list is [1, 2, 3]
" в качестве вывода.источник