Überladung?

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
Gast

was bedeutet das eigentlich?

Überladen von Operatoren

mfg

roland
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

das heißt wenn du Klassen definierst, kannst du ihnen sagen wie sich verhalten sollen, wenn man Operatoren auch sie anwendet. mal ein Beispiel:

Code: Alles auswählen

class zeit:
    def __init__(self,h=0,m=0,s=0):
        self.h,self.m,self.s=h,m,s
    def __add__(self,other):
        bla,s=divmod(self.s+other.s,60)
        bla,m=divmod(self.m+other.m+bla,60)
        h=self.h+other.h+bla
        return zeit(h,m,s)
    def __str__(self):
        return "%i:%i:%i"%(self.h,self.m,self.s)

z1=zeit(8,16,3)
z2=zeit(2,45,50)

summe=z1+z2
print summe

>>> "11:1:53"
Hier hab ich definiert, wie sich die Klassen verhalten sollen, wenn ich sie mit einem pluszeichen "behandle". Das kann man mit allen möglichen Zeichen machen, sie etwas mit variablen machen sollen. ich hab zum beispiel auch __str__ definiert. Das ist unverzichtbar, wenn ich eine sinnvolle anzeige mit print haben will.
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Noch nicht ganz verstanden. Ist dass richtig, wenn ich annehem, daß der Operator + (Pluszeichen) immer mit der Methode __add__() verknüpft ist?

Hans
RicmanX
User
Beiträge: 69
Registriert: Donnerstag 29. August 2002, 17:10
Wohnort: Erfurt
Kontaktdaten:

Nur wenn die Objekte der Klasse Zeit zugehörig sind (z1=zeit(8,16,3)).
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

hans hat geschrieben:Ist dass richtig, wenn ich annehem, daß der Operator + (Pluszeichen) immer mit der Methode __add__() verknüpft ist?
Nein, es könnte auch __radd__() zum Einsatz kommen (jetzt nicht auf RicmanXs Beipiel bezogen). Es hängt davon ab, ob und wenn, welcher der beiden Operanden(?) __add__() implemtiert. Sinnfreies Beispiel:

Code: Alles auswählen

class Wert:
    def __init__(self,wert):
        self.wert = str(wert)
        print ("__init__()"),self.wert
    def __add__(self,other):
        self.wert += " + " + str(other)
        print ("__add__()"),self.wert
    def __radd__(self,other):
        self.wert = str(other) + " + " + self.wert
        print ("__radd__()"),self.wert

wert = Wert(2)
wert + 3
1 + wert
Ausgabe:
__init__() 2
__add__() 2 + 3
__radd__() 1 + 2 + 3


Jan
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Voges hat geschrieben:Es hängt davon ab, ob und wenn, welcher der beiden Operanden(?) __add__() implemtiert.
Noch nicht geschnallt! Woran erkennt Python wann auf ein Pluszeichen welche Methode anzuwenden ist? Die Methoden werden doch beide mit den Parametern (self,other) aufgerufen und der Aufruf erfolgt wenn ich das richtig interprtiere durch das Pluszeichen z. B. aus der kommandozeile.

Hans

P. S. Vom überladen der Operatoren habe ich schon diverse Male gehört aber nie verstanden. War bisher kein Beinbruch. Aber irgendwann muß es ja mal klappen.
piddon
Gründer
Beiträge: 410
Registriert: Dienstag 30. Juli 2002, 18:03
Wohnort: Oestrich-Winkel
Kontaktdaten:

Das Überladen von Operatoren kann man bspw. mit dem Erstelle eine Klasse für Komplexe Zahlen sehr leicht erklären (Ich weiss, Python hat Complex!)

Also:

Nehmen wir an, wir haben eine Komplexe Zahl:

Z1 = Re1+jIm1
Z2 = Re2+jIm2

Die beiden Z1 & Z2 sind jeweils Zahlen vom Typ unserer Komplexen Klasse.

Wenn ich nun Z3 = Z1+Z2 anwenden würde, so wird erkannt, dass ich auf die beiden Objekte Z1 und Z2 eine Addition durchführe! Da kommt das Überladen ins Spiel. Habe ich eine eigene Methode für __add__ geschrieben, wird diese befolgt.

Ist jetzt alles schnell aus dem Ärmel geschüttelt, hoffentlich hilfts ein bissl...
irc: #python.de @ irc.freenode.net | [url=http://pythonwiki.pocoo.org]python-wiki[/url] | [url=http://www.pythonwiki.de/PythonDeForum/Faq]python-forum FAQ[/url]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

@hans: hier ist ne ganze Liste von denen, die überladen werden können, soll heißen, wie die Methoden dann in der Klasse heißen müssen. Zum bearbeiten wird immer add vor radd bevorzugt. radd versucht von rechts nach links zu addieren, add andersrum... __pot__ potenziert, __len__ liefert die Länge zurück...
übergeben tut man denen self für die eigene (linke) Klasse und other für die andere (rechte) Klasse. bei radd ist die Reihenfolge des Übergebens natürlich vertauscht... links die andere, rechts die eigene. Wenn du jetzt mein Beispiel mit der Zeit verfolgen würdest, könntest du sie noch subtrahieren, multiplizieren, potenzieren etc. Kommt halt auf den Anwendungsbereich an.
Zuletzt geändert von Milan am Sonntag 8. Dezember 2002, 14:35, insgesamt 1-mal geändert.
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

THX, jetzt ist Götterdämmerung angesagt. Kann zwar nicht behaupten, dass ich das schon im Schlaf beherrsche, aber steter tropen höhlt den Stein. Werde mich jetzt wohl nochmals durch die Doku wälzen müssen.

Hans
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Hans,

nochwas zu __add__() vs __radd__().
__radd()__ kommt zum Zuge falls die beiden Operanden von unterschiedlichen Typen sind. Um bei dem Beispiel mit den komplexen Zahlen zu bleiben, soll z.B zur Komplexen Zahl Z1 ein Integer addiert werden, Z3 = Z1 + 1, muss dies natürlich auch bei der Implementierung von __add__ berücksichtigt werden. Will mann jetzt aber zu einem Integerwert die Komplexe Zahl 1+2j addieren, Z3 = 1 + Z1 kann der Typ Integer nicht wissen, was ein Komplexe Zahl ist. also wird das 1.__add__(Z3) zu einer Typeerrorexception fürhen, jetzt versuchts Python mit dem Aufruf Z1.__radd__(1) und gibt das Ergebnis zurück.

Gruß

Dookie
[/code]
Antworten