Wenn ich in Java List.toString () aufrufe, wird automatisch die toString () -Methode für jedes Objekt in der Liste aufgerufen. Wenn meine Liste beispielsweise die Objekte o1, o2 und o3 enthält, sieht list.toString () ungefähr so aus:
"[" + o1.toString() + ", " + o2.toString() + ", " + o3.toString() + "]"
Gibt es eine Möglichkeit, ein ähnliches Verhalten in Python zu erzielen? Ich habe in meiner Klasse eine __str __ () -Methode implementiert, aber wenn ich eine Liste von Objekten drucke, verwende ich:
print 'my list is %s'%(list)
es sieht ungefähr so aus:
[<__main__.cell instance at 0x2a955e95f0>, <__main__.cell instance at 0x2a955e9638>, <__main__.cell instance at 0x2a955e9680>]
Wie kann ich Python dazu bringen, mein __str__ automatisch für jedes Element in der Liste aufzurufen (oder diesbezüglich zu diktieren)?
Antworten:
Das Aufrufen eines Strings in einer Python-Liste ruft die
__repr__
Methode für jedes Element im Inneren auf. Für einige Artikel__str__
und__repr__
sind gleich. Wenn Sie dieses Verhalten wünschen, gehen Sie wie folgt vor:quelle
__str__
mit__repr__
stimmt normalerweise nicht mit dem Python-Datenmodell überein , daher ist die von @ daniel-lew vorgeschlagene Lösung für das Listenverständnis pythonischer.str()
auf einer Listestr()
für jedes einzelne Element darin zurückgegeben.Sie können ein Listenverständnis verwenden , um mit jedem Element eine neue Liste zu erstellen. Str () würde automatisch:
quelle
print(map(str, mylist))
- es ist ein bisschen kürzerZwei einfache Dinge, die Sie tun können, die
map
Funktion verwenden oder ein Verständnis verwenden.Damit erhalten Sie jedoch eine Liste von Zeichenfolgen, keine Zeichenfolge. Sie müssen also auch die Saiten zusammenfügen.
oder
Anschließend können Sie dieses zusammengesetzte Zeichenfolgenobjekt drucken.
quelle
Je nachdem, wofür Sie diese Ausgabe verwenden möchten, ist dies
__repr__
möglicherweise besser geeignet:quelle
Ich stimme der vorherigen Antwort über die Verwendung von Listenverständnissen zu, aber Sie könnten dies sicherlich hinter einer Funktion verbergen, wenn dies das ist, was Ihr Boot schwimmt.
Nur zum Spaß habe ich list_str () rekursiv str () alles gemacht, was in der Liste enthalten ist.
quelle
__str__
und__repr__
separatEtwas wie das?
quelle
Das sollte ausreichen.
Beim Drucken von Listen sowie anderen Containerklassen werden die enthaltenen Elemente mit gedruckt
__repr__
, da__repr__
sie für die interne Objektdarstellung verwendet werden sollen. Wenn wir anrufen:help(object.__repr__)
wird es uns sagen:Und wenn wir es nennen
help(repr)
, wird Folgendes ausgegeben:Wenn
__str__
für ein Objekt implementiert ist und__repr__
nicht,repr(obj)
wird die Standardausgabe ausgegeben, genau wieprint(obj)
wenn keine von diesen implementiert sind.Der einzige Weg ist also,
__repr__
für Ihre Klasse zu implementieren . Ein möglicher Weg, dies zu tun, ist folgender:quelle
Die Ausgabe, die Sie erhalten, ist nur der Modulname des Objekts, der Klassenname und dann die Speicheradresse in hexadezimaler Reihenfolge als die
__repr__
Funktion nicht überschrieben wird.__str__
wird für die Zeichenfolgendarstellung eines Objekts bei Verwendung von print verwendet. Aber da Sie eine Liste von Objekten drucken und nicht über die Liste iterieren, um die aufzurufenstr
Methode für jedes Element .Um die
__str__
Funktion aufzurufen, müssen Sie Folgendes tun:Wenn Sie die
__repr__
Funktion überschreiben, können Sie die Druckmethode wie zuvor verwenden:Dann erhalten Sie "
my list is [1, 2, 3]
" als Ausgabe.quelle