list
ist es egal, dass Ihre Klasse eine __str__
Methode hat.
Wenn Sie ein Objekt drucken, ruft print
das Objekt str
auf, um eine geeignete Zeichenfolge zu erhalten. Die Funktion str
versucht, die __str__
-Methode des Objekts aufzurufen. Wenn sie jedoch nicht hat, ruft sie stattdessen die Methode __repr__
des Objekts auf. Und wenn es keine Definition für __repr__
in der Klassendefinition dieses Objekts gibt, dann erhalten Sie die von der Elternklasse übernommene, typischerweise die __repr__
vom Basis object
Typ.
list
und die anderen integrierten Sammlungen wie tuple
, set
und dict
haben keine __str__
Methode, so dass, wenn Sie versuchen, sie in Zeichenfolgen zu konvertieren (entweder explizit mit der str
Funktion oder implizit über print
) ihre __repr__
Methode wird aufgerufen. Und diese __repr__
Methoden rufen wiederum repr
für jedes Element in der Sammlung. Wenn Sie also eines dieser Sammlungsobjekte an print
übergeben, sehen Sie immer die __repr__
der Elemente. Und explizit str
auf der Sammlung aufrufen wird keinen Unterschied machen.
Wenn Sie die __str__
Darstellung der Elemente in einer list
oder Sammlung sehen möchten, müssen Sie über die Sammlung iterieren und str
explizit auf jedem Element aufrufen.
Hier ist ein kleines Code-Snippet (geeignet für Python 2 & 3), die diese Punkte veranschaulicht.
from __future__ import print_function
class Test(object):
def __str__(self):
return 'Test str'
def __repr__(self):
return 'Test repr'
a = [Test(), Test()]
print(id(a.__repr__), id(a.__str__))
print(a, str(a), repr(a))
for u in a:
print(u, str(u), repr(u))
Ausgang
3075508812 3075508812
[Test repr, Test repr] [Test repr, Test repr] [Test repr, Test repr]
Test str Test str Test repr
Test str Test str Test repr
Also, wenn Sie in der Lage sein wollen, eine Liste Ihrer Objekte als eine Einheit und die Saiten menschenfreundlich sein Objekt haben zu drucken, haben Sie ein paar Auswahl:
ändern Sie den Namen Ihres __str__
Methode __repr__
. Dies ist der einfachste Weg, und wie ich bereits sagte, wird die __repr__
verwendet, wenn eine __str__
nicht gefunden werden kann, wenn das Objekt an str
übergeben wird.
Lassen Sie die vorhandene __str__
-Methode in Ruhe und erstellen Sie eine __repr__
, die humanfreundlicher ist.Es wird jedoch vorgeschlagen, dass die __repr__
nützliche Informationen für einen Programmierer anzeigen, der sie sieht, und wenn es praktisch ist, ist es nett, wenn die __repr__
Zeichenfolge kopiert werden kann & in den Interpreter oder Skript eingefügt, um das Objekt neu zu erstellen.
Lassen Sie die vorhandene __str__
-Methode in Ruhe und erstellen Sie eine __repr__
, die __str__
aufruft. Obwohl es gültig ist, ist das ein bisschen albern. Eine verwandte Strategie besteht darin, __repr__
als Klassenattribut festzulegen, das auf __str__
verweist. Siehe unten für ein Beispiel.
class Test(object):
def __str__(self):
return 'Test str'
__repr__ = __str__
Was erwarten Sie stattdessen? –
Ich erwarte, die Liste der Objekte in Bezug auf die if-Bedingung zu drucken. Ich habe __str__ Methode implementiert. Sollte das nicht genug sein? – Binary
Das ist, was ist. Es druckt eine Liste mit einem Person-Objekt. Sie sehen die Standardmethode, mit der Python Objekte druckt. –