807 Stimmen

Wie druckt man Instanzen einer Klasse mit print()?

Ich lerne gerade die Grundlagen von Python. Wenn ich versuche, ein Objekt der Klasse Foobar unter Verwendung der print() Funktion erhalte ich eine Ausgabe wie diese:

<__main__.Foobar instance at 0x7ff2a18c>

Gibt es eine Möglichkeit, wie ich die Druckverhalten (oder die String-Darstellung ) einer Klasse y su Objekte ? Zum Beispiel, wenn ich aufrufe print() auf ein Klassenobjekt, möchte ich seine Datenelemente in einem bestimmten Format ausgeben. Wie kann ich das in Python erreichen?

Wenn Sie mit C++-Klassen vertraut sind, können Sie die obigen Ergebnisse für die Standard ostream durch Hinzufügen einer friend ostream& operator << (ostream&, const Foobar&) Methode für die Klasse.

914voto

Chris Lutz Punkte 69879
>>> class Test:
...     def __repr__(self):
...         return "Test()"
...     def __str__(self):
...         return "member of Test"
... 
>>> t = Test()
>>> t
Test()
>>> print(t)
member of Test

El __str__ Methode ist diejenige, die aufgerufen wird, wenn Sie sie drucken, und die __repr__ Methode ist das, was passiert, wenn Sie die repr() Funktion (oder wenn Sie sie mit der interaktiven Eingabeaufforderung ansehen).

Wenn keine __str__ Methode angegeben wird, druckt Python das Ergebnis von __repr__ stattdessen. Wenn Sie definieren __str__ aber nicht __repr__ wird Python das, was Sie oben sehen, als __repr__ aber dennoch verwenden __str__ zum Drucken.

186voto

dbr Punkte 158949

Wie Chris Lutz erwähnte wird dies durch die __repr__ Methode in Ihrer Klasse.

Aus der Dokumentation von repr() :

Bei vielen Typen versucht diese Funktion, eine Zeichenkette zurückzugeben, die ein Objekt mit demselben Wert ergibt, wenn sie an eval() , andernfalls ist die Darstellung eine in spitzen Klammern eingeschlossene Zeichenkette, die den Namen des Typs des Objekts zusammen mit zusätzlichen Informationen enthält, zu denen häufig der Name und die Adresse des Objekts gehören. Eine Klasse kann steuern, was diese Funktion für ihre Instanzen zurückgibt, indem sie eine __repr__() Methode.

Gegeben die folgende Klasse Test:

class Test:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __repr__(self):
        return "<Test a:%s b:%s>" % (self.a, self.b)

    def __str__(self):
        return "From str method of Test: a is %s, b is %s" % (self.a, self.b)

verhält es sich in der Python-Shell folgendermaßen:

>>> t = Test(123, 456)
>>> t
<Test a:123 b:456>
>>> print repr(t)
<Test a:123 b:456>
>>> print(t)
From str method of Test: a is 123, b is 456
>>> print(str(t))
From str method of Test: a is 123, b is 456

Wenn keine __str__ Methode definiert ist, print(t) (oder print(str(t)) ) wird das Ergebnis von __repr__ stattdessen

Wenn keine __repr__ Methode definiert ist, wird die Standardmethode verwendet, was in etwa gleichbedeutend ist mit.

def __repr__(self):
    return "<%s instance at %s>" % (self.__class__.__name__, id(self))

110voto

John Punkte 1441

Wenn Sie sich in einer Situation befinden wie @Keith könnten Sie versuchen:

print(a.__dict__)

Es widerspricht dem, was ich als guten Stil bezeichnen würde, aber wenn Sie nur versuchen, Fehler zu beheben, sollte es das tun, was Sie wollen.

82voto

user394430 Punkte 2475

Ein allgemeiner Weg, der auf jede Klasse ohne spezifische Formatierung angewendet werden kann, könnte wie folgt aussehen:

class Element:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number

    def __str__(self):
        return str(self.__class__) + ": " + str(self.__dict__)

Und dann,

elem = Element('my_name', 'some_symbol', 3)
print(elem)

produziert

__main__.Element: {'symbol': 'some_symbol', 'name': 'my_name', 'number': 3}

21voto

Mike from PSG Punkte 4235

Eine hübschere Version der Antwort von @user394430

class Element:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number

    def __str__(self):
        return  str(self.__class__) + '\n'+ '\n'.join(('{} = {}'.format(item, self.__dict__[item]) for item in self.__dict__))

elem = Element('my_name', 'some_symbol', 3)
print(elem)

Erzeugt eine visuell ansprechende Liste der Namen und Werte.

<class '__main__.Element'>
name = my_name
symbol = some_symbol
number = 3

Eine noch raffiniertere Version (danke Ruud) sortiert die Artikel:

def __str__(self):
    return  str(self.__class__) + '\n' + '\n'.join((str(item) + ' = ' + str(self.__dict__[item]) for item in sorted(self.__dict__)))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X