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)