Seite 1 von 1

Überladung?

Verfasst: Sonntag 8. Dezember 2002, 02:22
von Gast
was bedeutet das eigentlich?

Überladen von Operatoren

mfg

roland

Verfasst: Sonntag 8. Dezember 2002, 08:17
von Milan
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.

Verfasst: Sonntag 8. Dezember 2002, 10:39
von hans
Noch nicht ganz verstanden. Ist dass richtig, wenn ich annehem, daß der Operator + (Pluszeichen) immer mit der Methode __add__() verknüpft ist?

Hans

Verfasst: Sonntag 8. Dezember 2002, 11:56
von RicmanX
Nur wenn die Objekte der Klasse Zeit zugehörig sind (z1=zeit(8,16,3)).

Verfasst: Sonntag 8. Dezember 2002, 12:11
von Voges
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

Verfasst: Sonntag 8. Dezember 2002, 12:42
von hans
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.

Verfasst: Sonntag 8. Dezember 2002, 12:57
von piddon
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...

Verfasst: Sonntag 8. Dezember 2002, 13:54
von Milan
@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.

Verfasst: Sonntag 8. Dezember 2002, 14:04
von hans
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

Verfasst: Montag 9. Dezember 2002, 15:45
von Dookie
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]