Betrachten Sie diese Klasse:
class foo(object):
pass
Die Standarddarstellung der Zeichenfolge sieht ungefähr so aus:
>>> str(foo)
"<class '__main__.foo'>"
Wie kann ich diese Anzeige zu einer benutzerdefinierten Zeichenfolge machen?
Implementieren Sie __str__()
oder __repr__()
in der Metaklasse der Klasse.
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C(object):
__metaclass__ = MC
print C
Verwenden __str__
Sie diese Option, wenn Sie eine lesbare Zeichenfolge meinen, __repr__
für eindeutige Darstellungen.
_representation
dem Klassenkörper undreturn self._representation
der__repr__()
Methode der Metaklasse eine Zeichenfolge hinzufügen .__repr__
für die Darstellung verwenden möchtenC
. Eine Alternative zu einem_representation
Mitglied besteht darin, eine Metaklassenfabrik zu erstellen, in der eine Metaklasse mit der richtigen Metaklasse erstellt wird__repr__
(dies kann hilfreich sein, wenn Sie diese häufig verwenden).quelle
instances
die Klasse, nicht für die Klasse selbst.Wenn Sie zwischen dem ersten wählen
__repr__
oder__str__
sich für den ersten entscheiden müssen, wie dies standardmäßig der__str__
Fall ist,__repr__
wenn die Implementierung nicht definiert wurde.Beispiel für einen benutzerdefinierten Vektor3:
In diesem Beispiel wird
repr
erneut eine Zeichenfolge zurückgegeben, die direkt verwendet / ausgeführt werden kann, währendstr
dies als Debug-Ausgabe nützlicher ist.quelle
__repr__
vs__str__
richtig ist, beantwortet dies nicht die eigentliche Frage, die sich auf Klassenobjekte und nicht auf Instanzen bezieht.Die genehmigte Antwort von Ignacio Vazquez-Abrams ist völlig richtig. Es ist jedoch aus der Python 2-Generation. Ein Update für das jetzt aktuelle Python 3 wäre:
Wenn Sie Code wünschen, der sowohl in Python 2 als auch in Python 3 ausgeführt wird, haben Sie in den sechs Modulen Folgendes behandelt:
Wenn Sie eine Klasse haben, für die Sie einen benutzerdefinierten statischen Repräsentanten haben möchten, funktioniert der oben beschriebene klassenbasierte Ansatz hervorragend. Wenn Sie jedoch mehrere haben, müssen Sie
MC
für jede eine ähnliche Metaklasse generieren , und das kann lästig werden. Wenn Sie in diesem Fall Ihre Metaprogrammierung noch einen Schritt weiter gehen und eine Metaklassenfabrik erstellen, werden die Dinge etwas sauberer:Drucke:
Metaprogrammierung ist nicht etwas, das Sie normalerweise jeden Tag brauchen - aber wenn Sie es brauchen, ist es genau das Richtige!
quelle
Ich füge nur all die schönen Antworten hinzu, meine Version mit Dekoration:
stdout:
Die Nachteile:
C
ohne eine Superklasse deklarieren (neinclass C:
)C
Instanzen sind Instanzen einer seltsamen Ableitung, daher ist es wahrscheinlich eine gute Idee, auch__repr__
für die Instanzen eine hinzuzufügen .quelle