Python __str__ и списки
В Java, если я вызываю List.toString(), он автоматически вызывает метод toString() для каждого объекта внутри Списка. Например, если в моем списке содержатся объекты 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__ для каждого элемента внутри списка (или, если это не так)?
Ответы
Ответ 1
Строка вызова в списке python вызывает метод __repr__
для каждого элемента внутри. Для некоторых элементов __str__
и __repr__
совпадают. Если вы хотите этого поведения, выполните следующие действия:
def __str__(self):
...
def __repr__(self):
return self.__str__()
Ответ 2
Вы можете использовать описание списка для автоматического создания нового списка с каждым элементом str() 'd:
print([str(item) for item in mylist])
Ответ 3
Две простые вещи, которые вы можете сделать, используйте функцию map
или используйте понимание.
Но это дает вам список строк, а не строку. Поэтому вам также нужно присоединиться к строкам вместе.
s= ",".join( map( str, myList ) )
или
s= ",".join( [ str(element) for element in myList ] )
Затем вы можете напечатать этот составной строковый объект.
print 'my list is %s'%( s )
Ответ 4
В зависимости от того, для чего вы хотите использовать этот вывод, возможно, __repr__
может быть более уместным:
import unittest
class A(object):
def __init__(self, val):
self.val = val
def __repr__(self):
return repr(self.val)
class Test(unittest.TestCase):
def testMain(self):
l = [A('a'), A('b')]
self.assertEqual(repr(l), "['a', 'b']")
if __name__ == '__main__':
unittest.main()
Ответ 5
Я согласен с предыдущим ответом об использовании методов списка, чтобы сделать это, но вы можете скрыть это за функцией, если это то, что плавает ваша лодка.
def is_list(value):
if type(value) in (list, tuple): return True
return False
def list_str(value):
if not is_list(value): return str(value)
return [list_str(v) for v in value]
Просто для удовольствия, я сделал list_str() рекурсивно str() все содержащееся в списке.
Ответ 6
Что-то вроде этого?
a = [1, 2 ,3]
[str(x) for x in a]
# ['1', '2', '3']
Ответ 7
Этого должно быть достаточно.
При печати списков так же, как и других контейнерных классов, содержащиеся элементы будут напечатаны с использованием __repr__
, поскольку __repr__
предназначен для использования для внутреннего представления объектов. Если мы вызовем: help(object.__repr__)
он скажет нам:
Help on wrapper_descriptor:
__repr__(self, /)
Return repr(self).
И если мы вызовем help(repr)
он выведет:
Help on built-in function repr in module builtins:
repr(obj, /)
Return the canonical string representation of the object.
For many object types, including most builtins, eval(repr(obj)) == obj.
Если __str__
реализован для объекта и __repr__
не является repr(obj)
будет выводиться вывод по умолчанию, так же как print(obj)
если не реализовано ни одно из них.
Таким образом, единственный способ - реализовать __repr__
для вашего класса. Один из возможных способов сделать это заключается в следующем:
class C:
def __str__(self):
return str(f"{self.__class__.__name__} class str ")
C.__repr__=C.__str__
ci = C()
print(ci) #C class str
print(str(ci)) #C class str
print(repr(ci)) #C class str
Ответ 8
Вы можете использовать формат.
def __str__(self):
return("my list is".format(self.list1))
Ответ 9
Вывод, который вы получаете - это просто имя объектного модуля, имя класса, а затем адрес памяти в шестнадцатеричном формате, поскольку функция __repr__
не переопределяется.
__str__
используется для строкового представления объекта при использовании print. Но так как вы печатаете список объектов, а не просматриваете список для вызова метода str
для каждого элемента, он выводит представление объектов.
Чтобы вызвать функцию __str__
вам нужно сделать что-то вроде этого:
'my list is %s' % [str(x) for x in myList]
Если вы переопределите функцию __repr__
вы можете использовать метод печати, как вы это __repr__
ранее:
class cell:
def __init__(self, id):
self.id = id
def __str__(self):
return str(self.id) # Or whatever
def __repr__(self):
return str(self) # function invoked when you try and print the whole list.
myList = [cell(1), cell(2), cell(3)]
'my list is %s' % myList
Тогда вы получите " my list is [1, 2, 3]
" в качестве вывода.
Ответ 10
это вопрос, который имел ссылку на эту страницу:
class Node:
def __init__(self, id):
self.id = id
self.neighbours = []
self.distance = 0
def __str__(self):
return str(self.id)
uno = Node(1)
due = Node(2)
tri = Node(3)
qua = Node(4)
print (uno)
uno.neighbours.append([due.id,4])
uno.neighbours.append(4)
uno.neighbours.append([tri.id,5])
uno.neighbours.append(5)
print(uno.neighbours)