JROppenheimer hat geschrieben:Der Assi von meinem Prof der sieht das bissie anders WARUM AUCH IMMER, absolut unlogisch wie ich finde, kannst ja aber hier mal nachlesen "OO-Programmierung für ganz blöde" damit Du nciht fälschlicher weise glaubst, dieses Übel geht von mir aus.
Ich hoffe wir sind uns einig, dass "AnzahlKoefe" eine Klassenattribut wäre, da alles Instanten von Student, dieses Attribut gemeinsam haben (oder hab ich das immernoch net richtig kapiert?!)
Wenn man von normalen Menschen ausgeht, dann sollte das wohl richtig sein. Mehr als einen Kopf haben die wenigsten. Manchmal gibt's aber recht "kopflose" Exemplare.
In der Aufgabe sollten wir Name und Matrikelnummer als KLassenattribut einfügen (was wie ich finde ziemlicher quatsch ist)
Das ist in der Tat quatsch. Würde ich auch zur Lösung mit dazu schreiben. Und/Oder mal mit dem Prof. über so eine unsinnige Aufgabenstellung reden.
Ich dachte, dass wenn ich "bla = None" schreibe, dass die Variable schon angelegt wird, o.ä.
Ja, bei der ersten Bindung wird der Name auf Klassenebene angelegt, wenn man ihn dort definiert.
Und dass der Betreuer namen und Matrikelnummer nciht hat...? Ich kann doch Tutor.name und Tutor.matno auch hinterher noch definieren, oder?!
Kann man, aber das ist schlechter Stil. Ein Aufruf der Klasse sollte ein möglichst vollständig initialisiertes Objekt liefern und Unterklassen sollten die `__init__()` Methode der Oberklasse mit den entsprechenden Werten aufrufen. Die Unterklasse kann ja nie wissen was in der Oberklasse alles bei `__init__()` passieren muss/soll. Wenn man an die `Student` Objekte wie in meinem Beispiel im anderen Thread automatisch Matrikelnummern vergibt, dann muss/sollte das zum Zeitpunkt der Initialisierung des Objekts passieren. Auch wenn man einen `Tutor` erstellt. Der soll sich ja grundsätzlich gleich Verhalten wie die Oberklasse. Das ist der Sinn von Vererbung.
Üblicherweise macht man die Initialisierung von Unterklassen nach folgendem Muster:
Code: Alles auswählen
class A:
def __init__(self, spam):
self.spam = spam
class B(A):
def __init__(self, spam, parrot):
A.__init__(self, spam)
self.parrot = parrot