Em Java, se eu chamar List.toString (), ele chamará automaticamente o método toString () em cada objeto dentro da Lista. Por exemplo, se minha lista contiver objetos o1, o2 e o3, list.toString () seria algo assim:
"[" + o1.toString() + ", " + o2.toString() + ", " + o3.toString() + "]"
Existe uma maneira de obter um comportamento semelhante em Python? Implementei um método __str __ () em minha classe, mas quando imprimo uma lista de objetos, usando:
print 'my list is %s'%(list)
parece algo assim:
[<__main__.cell instance at 0x2a955e95f0>, <__main__.cell instance at 0x2a955e9638>, <__main__.cell instance at 0x2a955e9680>]
como posso fazer com que o python chame meu __str__ automaticamente para cada elemento dentro da lista (ou dict para esse assunto)?
Respostas:
Chamar string em uma lista python chama o
__repr__
método em cada elemento interno. Para alguns itens,__str__
e__repr__
são iguais. Se você deseja esse comportamento, faça:fonte
__str__
com__repr__
geralmente não concorda com o modelo de dados Python , então a solução de compreensão de lista proposta por @ daniel-lew é mais pythônica.str()
em uma lista retornadastr()
para cada um dos elementos individuais dentro.Você pode usar uma compreensão de lista para gerar uma nova lista com cada item str () 'd automaticamente:
fonte
print(map(str, mylist))
- é um pouco mais curtoDuas coisas fáceis que você pode fazer, usar a
map
função ou usar uma compreensão.Mas isso dá a você uma lista de strings, não uma string. Portanto, você também precisa juntar as cordas.
ou
Em seguida, você pode imprimir este objeto de string composto.
fonte
Dependendo da finalidade para a qual você deseja usar essa saída, talvez
__repr__
seja mais apropriado:fonte
Eu concordo com a resposta anterior sobre o uso de compreensões de lista para fazer isso, mas você certamente poderia esconder isso atrás de uma função, se é isso que faz seu barco flutuar.
Apenas por diversão, fiz list_str () recursivamente str () tudo contido na lista.
fonte
__str__
e__repr__
separadamenteAlgo assim?
fonte
Isso deve bastar.
Ao imprimir listas, bem como outras classes de contêineres, os elementos contidos serão impressos usando
__repr__
, porque__repr__
deve ser usado para representação de objetos internos. Se ligarmos:help(object.__repr__)
ele nos dirá:E se chamarmos
help(repr)
, a saída será:Se
__str__
for implementado para um objeto e__repr__
não forrepr(obj)
, produzirá a saída padrão, assim comoprint(obj)
quando nenhum desses for implementado.Portanto, a única maneira é implementar
__repr__
para sua classe. Uma maneira possível de fazer isso é:fonte
A saída que você está obtendo é apenas o nome do módulo do objeto, o nome da classe e o endereço da memória em hexadecimal como o
__repr__
função não é substituída.__str__
é usado para a representação de string de um objeto ao usar imprimir. Mas como você está imprimindo uma lista de objetos, e não iterando a lista para chamar ostr
método para cada item, ele imprime a representação dos objetos.Para ter a
__str__
função invocada, você precisa fazer algo assim:Se você substituir a
__repr__
função, poderá usar o método de impressão como fazia antes:Então você obterá "
my list is [1, 2, 3]
" como sua saída.fonte