special methods

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mechanicalStore
User
Beiträge: 178
Registriert: Dienstag 29. Dezember 2009, 00:09

Hallo Zusammen,

statt Programmieren gehe ich im Moment mal wieder meiner Lieblingsbeschäftigung nach, zu analysieren, warum manche Dinge so sind wie sie sind - und ich sie nicht verstehe. In einem älteren thread - nämlich hier: viewtopic.php?t=54719 - geht es um folgende Codeschnipsel:

Code: Alles auswählen

    def __repr__(self):
        return (
            f"{self.__class__.__name__}"
            f"({self.project!r}, {self.date!r}, {self.start!r}, {self.stop!r})"
        )

    def __str__(self):
        return self.DELIMITER.join(
            [self.project, self.date, self.start, self.stop]
        )
Diese waren von Dir, __blackjack__ und auf meine damalige Frage nach __repr__ hattest Du das geantwortet:
Entry.__repr__()` wird von `list.__repr__()` benutzt, das wiederum von `list.__str__()` verwendet wird, das vom `print()` verwendet wird das in der letzten Zeile von `main()` steht.
Leider bis heute nicht richtig kapiert. In der Doku steht dazu, dass __str__ von str() oder print() verwendet wird, und __reper__ von repr(). Soweit sogut. Weiterhin steht da, dass __repr__ eigentlich nur zu Debug-Zwecken verwendet wird , weil es gegenüber __str__ erweiterte informationen liefert.

In Deinem Antwortsatz steht aber, dass das jeweils eine von dem anderen benutzt wird. Dazu habe ich keinen Hinweis gefunden, oder es halt nicht richtig kapiert, was Du meinst. Wo kann man das nachlesen, dass Entry__repr__() von list.__repr__() benutzt wird, oder besser, ich habe bei list keinerlei Hinweis auf __repr__ gefunden. Ebenso keinen Hinweis, dass __list__.str() von list.__repr() benutzt wird, in der Doku werden diese Dinge komplett auseinander gehalten.

Ebenso die Frage, wieso überhaupt die special methods hinter den eigentlichen Methoden liegen, also warum nicht gleich repr() neu definieren, anstatt __repr__ ?

Und warum steht das !r da drin, wo wir uns doch sowieso innerhalb der __repr__ methode befinden?

Wie (und warum) geht man grundsätzlich mit diesen Methoden um, z.B. mit __mul__ ? Sind diese (mathematischen) methoden z.B. nur dazu da, um z.B. ähnlich C++ die Operatoren zu überladen?

Danke und Gruß
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

In der Doku steht zu __str__ das:
https://docs.python.org/3/reference/datamodel.html#object.__str__ hat geschrieben:The default implementation defined by the built-in type object calls object.__repr__().
Und weil die Argumente in der __repr__-Darstellung wieder eine Repräsentation sein sollten, muß im Formatstring !r benutzt werden, um die Argumente richtig zu formatieren.

In Python gibt es kein Überladen von Funktionen (im Ggs zu C++). Das heißt, man müßte in jedem neu definierten repr alle Varianten berücksichtigen, da ist es viel einfacher, Objektoriertierung zu benutzen.

Und ja, diese __-Methoden sind die Art, wie man Operatoren in Python definiert.
Antworten