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.

19voto

Alon Punkte 121

Einfach. Im Druck, tun:

print(foobar.__dict__)

so lange der Konstruktor

__init__

16voto

PeterM Punkte 1992

Für Python 3:

Wenn das spezifische Format nicht wichtig ist (z. B. für die Fehlersuche), erben Sie einfach von der Klasse Printable unten. Sie müssen nicht für jedes Objekt Code schreiben.

Inspiriert durch ce Antwort

class Printable:
    def __repr__(self):
        from pprint import pformat
        return "<" + type(self).__name__ + "> " + pformat(vars(self), indent=4, width=1)

# Example Usage
class MyClass(Printable):
    pass

my_obj = MyClass()
my_obj.msg = "Hello"
my_obj.number = "46"
print(my_obj)

14voto

tnotstar Punkte 1279

Um die Antwort von @dbr zu ergänzen, hier ein Beispiel für die Implementierung dieses Satzes aus der offiziellen Dokumentation, die er zitiert hat:

"[...] um eine Zeichenkette zurückzugeben, die ein Objekt mit demselben Wert ergibt, wenn sie an eval() übergeben wird, [...]"

Angesichts dieser Klassendefinition:

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

    def __str__(self):
        return "An instance of class Test with state: a=%s b=%s" % (self._a, self._b)

    def __repr__(self):
        return 'Test("%s","%s")' % (self._a, self._b)

Jetzt ist es einfach, die Instanz von Test Klasse:

x = Test('hello', 'world')
print 'Human readable: ', str(x)
print 'Object representation: ', repr(x)
print

y = eval(repr(x))
print 'Human readable: ', str(y)
print 'Object representation: ', repr(y)
print

Wenn wir also das letzte Stück Code ausführen, erhalten wir:

Human readable:  An instance of class Test with state: a=hello b=world
Object representation:  Test("hello","world")

Human readable:  An instance of class Test with state: a=hello b=world
Object representation:  Test("hello","world")

Aber, wie ich in meinem letzten Kommentar sagte: mehr Informationen sind nur ici !

12voto

flow_chart Punkte 155

Sie müssen Folgendes verwenden __repr__ . Dies ist eine Standardfunktion wie __init__ . Zum Beispiel:

class Foobar():
    """This will create Foobar type object."""

    def __init__(self):
        print "Foobar object is created."

    def __repr__(self):
        return "Type what do you want to see here."

a = Foobar()

print a

9voto

minker Punkte 272

__repr__ y __str__ werden bereits in vielen Antworten erwähnt. Ich möchte nur hinzufügen, dass Sie, wenn Sie zu faul sind, diese magischen Funktionen zu Ihrer Klasse hinzuzufügen, Folgendes verwenden können objprint . Ein einfacher Dekorateur @add_objprint wird Ihnen helfen, die __str__ Methode zu Ihrer Klasse hinzufügen und Sie können die print für die Instanz. Wenn Sie möchten, können Sie natürlich auch objprint Funktion aus der Bibliothek, um beliebige Objekte in menschenlesbarem Format zu drucken.

from objprint import add_objprint

class Position:
    def __init__(self, x, y):
        self.x = x
        self.y = y

@add_objprint
class Player:
    def __init__(self):
        self.name = "Alice"
        self.age = 18
        self.items = ["axe", "armor"]
        self.coins = {"gold": 1, "silver": 33, "bronze": 57}
        self.position = Position(3, 5)

print(Player())

Die Ausgabe ist wie folgt

<Player
  .name = 'Alice',
  .age = 18,
  .items = ['axe', 'armor'],
  .coins = {'gold': 1, 'silver': 33, 'bronze': 57},
  .position = <Position
    .x = 3,
    .y = 5
  >
>

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