Hallo,
es ist soweit - als Frischling traue ich mich nun hier nach einer Antwort zu suchen, die ich woanders nicht finden konnte.
Kann man mit einer Objektmethode, Daten aus dem selben Objekt, an ein anderes Objekt übergeben?
Ich habe eine Klasse "BankKonto" erstellt. In der Klasse habe ich Methoden definiert wie "einzahlen" und "abheben". Nun möchte ich noch eine Methode "ueberweisen" erstellen.
Aber wie stelle ich es an, dass das Objekt "meinKonto", welches natürlich über eine Kontonummer verfügt, Geld auf "deinKonto" überweisen kann?
Woher soll dass eine Objekt von der Existenz des anderen Objekt wissen?
Mit Objektmethode Daten an ein anderes Objekt übergeben
Hallo!
Alles was du an einen Namen binden kannst, kannst du auch als Parameter übergeben. Ich würde hier aber nicht Geld zwischen Konten überweisen lassen. Da bietet sich doch geradezu das Bank-Objekt an, welches Geld vom einen Konto abhebt und auf das andere überweist. So müssen Konten nichts von einander wissen.
Sebastian
Alles was du an einen Namen binden kannst, kannst du auch als Parameter übergeben. Ich würde hier aber nicht Geld zwischen Konten überweisen lassen. Da bietet sich doch geradezu das Bank-Objekt an, welches Geld vom einen Konto abhebt und auf das andere überweist. So müssen Konten nichts von einander wissen.
Sebastian
Das Leben ist wie ein Tennisball.
Danke für den Denkanstoß!
Meine Methode sieht nun so aus und funktioniert wie gewünscht:
Mit einer "Bank" Klasse habe ich mal kurz rumgespielt, verwirrt mich aber noch zu sehr...
Sollte die Klasse "BankKonto" dann von "Bank" erben?
Welche Attribute und Methoden würdest Du den Klassen geben?
Meine Methode sieht nun so aus und funktioniert wie gewünscht:
Code: Alles auswählen
def ueberweisen(self, betrag, konto):
if self.kontonummer == konto.kontonummer:
print "Es kann nicht auf das selbe Konto überweisen werden!"
else:
self.abheben(betrag)
konto.einzahlen(betrag)
print "Auf das Konto mit der Nummer", konto.kontonummer, \
"wurden", betrag, "Euro", \
"vom Konto mit der Nummer", self.kontonummer, "überwiesen."
Sollte die Klasse "BankKonto" dann von "Bank" erben?
Welche Attribute und Methoden würdest Du den Klassen geben?
@hal42: Vererbung bildet "ist ein(e)"-Beziehungen ab und ein Konto ist keine Bank. Also sollte Konto auch keine Unterklasse von Bank sein.
Du vermischt in der Methode übrigens Programmlogik und Benutzerinteraktion sehr stark und der aufrufende Code hat keine vernünftige Möglichkeit Fehler mitzubekommen. Eine unerlaubte Aktion sollte zu einer Ausnahme führen und die ``print``-Ausgaben wären eher Aufgabe des aufrufenden Codes.
Je nach dem wie die "Welt" aussieht, die man da modelliert, könnte die Überprüfung der Kontonummer falsch sein, denn es kann ja durchaus die gleiche Kontonummer bei verschiedenen Banken geben und da wäre eine Überweisung möglich.
Was eine Bank für Attribute und Methoden hat, hängt ganz davon ab was Du im Programm abbilden willst. Das ist immer so ein Problem mit "sinnlosen" Übungsprojekten, man kann das beliebig kompliziert machen und es gibt bei vielen Entscheidungen kein "richtig" oder "falsch" sondern nur ein "anders".
Wenn Du Konten hast, dann wird eine Bank die intern irgendwie verwalten. Vielleicht hat sie auch einen Namen. Und eine Bankleitzahl. Dann könnte vielleicht auch schon eine `Banken`-Klasse Sinn machen, wo die verschiedenen Banken verwaltet werden. Eine Bank könnte auch "eigene" Konten und eine Bargeldreserve haben. Und die Möglichkeit Daueraufträge zu verwalten und auszuführen. Sparbücher, Aktienkurse, Bankfilialen, Geldautomaten, Bankräuber, und so weiter. Kann man wie gesagt, beliebig kompliziert gestalten. Spätestens wenn das Thema Finanzkrise in den Entwurf Einzug hält, sollte man das Geld in Cents und als ganze Zahlen speichern, denn die können in Python "beliebig" gross werden, so dass man keine Sorgen haben muss die Rettungspakete für die armen notleidenden Banken nicht mehr mit dem beschränkten Wertebereich von `float`\s darstellen zu können.
Du vermischt in der Methode übrigens Programmlogik und Benutzerinteraktion sehr stark und der aufrufende Code hat keine vernünftige Möglichkeit Fehler mitzubekommen. Eine unerlaubte Aktion sollte zu einer Ausnahme führen und die ``print``-Ausgaben wären eher Aufgabe des aufrufenden Codes.
Je nach dem wie die "Welt" aussieht, die man da modelliert, könnte die Überprüfung der Kontonummer falsch sein, denn es kann ja durchaus die gleiche Kontonummer bei verschiedenen Banken geben und da wäre eine Überweisung möglich.
Was eine Bank für Attribute und Methoden hat, hängt ganz davon ab was Du im Programm abbilden willst. Das ist immer so ein Problem mit "sinnlosen" Übungsprojekten, man kann das beliebig kompliziert machen und es gibt bei vielen Entscheidungen kein "richtig" oder "falsch" sondern nur ein "anders".
Wenn Du Konten hast, dann wird eine Bank die intern irgendwie verwalten. Vielleicht hat sie auch einen Namen. Und eine Bankleitzahl. Dann könnte vielleicht auch schon eine `Banken`-Klasse Sinn machen, wo die verschiedenen Banken verwaltet werden. Eine Bank könnte auch "eigene" Konten und eine Bargeldreserve haben. Und die Möglichkeit Daueraufträge zu verwalten und auszuführen. Sparbücher, Aktienkurse, Bankfilialen, Geldautomaten, Bankräuber, und so weiter. Kann man wie gesagt, beliebig kompliziert gestalten. Spätestens wenn das Thema Finanzkrise in den Entwurf Einzug hält, sollte man das Geld in Cents und als ganze Zahlen speichern, denn die können in Python "beliebig" gross werden, so dass man keine Sorgen haben muss die Rettungspakete für die armen notleidenden Banken nicht mehr mit dem beschränkten Wertebereich von `float`\s darstellen zu können.

Verdammt, Du hast recht!Spätestens wenn das Thema Finanzkrise in den Entwurf Einzug hält, sollte man das Geld in Cents und als ganze Zahlen speichern, denn die können in Python "beliebig" gross werden, so dass man keine Sorgen haben muss die Rettungspakete für die armen notleidenden Banken nicht mehr mit dem beschränkten Wertebereich von `float`\s darstellen zu können.


Du meinst, ich sollte die print-Zeilen besser weg lassen und dafür true, false oder so per return zurückgeben, oder habe ich Dich falsch verstanden?Du vermischt in der Methode übrigens Programmlogik und Benutzerinteraktion sehr stark und der aufrufende Code hat keine vernünftige Möglichkeit Fehler mitzubekommen. Eine unerlaubte Aktion sollte zu einer Ausnahme führen und die ``print``-Ausgaben wären eher Aufgabe des aufrufenden Codes.
wenn ja, hilft mir vielleicht ein kleines Beispiel weiter.
Danke!
@hal42: Bei `ueberweisen()` würde ich weder eine Textausgabe noch einen Rückgabewert erwarten. Aber wenn etwas schief läuft halt eine Ausnahme, damit man darauf auf der entsprechenden Aufrufebene reagieren kann.