was bedeutet das eigentlich?
Überladen von Operatoren
mfg
roland
Überladung?
das heißt wenn du Klassen definierst, kannst du ihnen sagen wie sich verhalten sollen, wenn man Operatoren auch sie anwendet. mal ein Beispiel:
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.
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"
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:hans hat geschrieben:Ist dass richtig, wenn ich annehem, daß der Operator + (Pluszeichen) immer mit der Methode __add__() verknüpft ist?
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
__init__() 2
__add__() 2 + 3
__radd__() 1 + 2 + 3
Jan
-
- User
- Beiträge: 728
- Registriert: Sonntag 22. September 2002, 08:32
- Wohnort: Sauerland
- Kontaktdaten:
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.Voges hat geschrieben:Es hängt davon ab, ob und wenn, welcher der beiden Operanden(?) __add__() implemtiert.
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.
-
- 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...
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]
@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.
ü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.
-
- 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
Hans
-
- 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]
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]