beziehung von klasseninstanzen untereinander

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
JROppenheimer
User
Beiträge: 13
Registriert: Mittwoch 7. Dezember 2005, 09:17
Wohnort: FFM

Ich hab folgende 2 Klassen:

Code: Alles auswählen

class Student(object):
    name = None
    matno = None
    def __init__(self, betreuerPersNummer, name, matno):
        self.name = name
        self.matno = matno
        self.betreuer = betreuerPersNummer
        
        
class Tutor(Student):
    persNummer = None
    def __init__(self, persNummer):
        self.studentenListe = []
        self.persNummer = persNummer
Jetzt ist mein Problem, dass der Tutor in Student anhand seiner personalnummer identifiziert wird.(das soll so sein Aufgabenstellung :D)
Aber ich weiss nicht, wie ich jetzt beim erstellen einer Instanz von Student, den Studenten automatisch in die studentenListe von Tutor eintragen kann...

hoffe das ist verständlich und mir kann einer helfen.

gruß Timmy

Edit (Leonidas): Code in Python-Tags gesetzt.
YOU NO MESS WITH LO WANG!
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Verwende ein Dictionary, in dem jeder Personalnummer die entsprechende Tutor-Instanz zugeordnet ist.
JROppenheimer
User
Beiträge: 13
Registriert: Mittwoch 7. Dezember 2005, 09:17
Wohnort: FFM

ja das is ja immer so ne sache, wie ich das lösen würde und wie die das von mir wollen......sinn- und hirnloses gesocks ..... :D

ich hatte das vorher anders gelöst, nämlich indem an die StudentInstanz nicht die personalnummer des betreuers sondern den variablennamen des TutorInstanz übergeben habe, der der Betreuer ist .... aber wie ich das nur mit der personalnummer machen soll ... kA
YOU NO MESS WITH LO WANG!
BlackJack

JROppenheimer hat geschrieben:Ich hab folgende 2 Klassen:

Code: Alles auswählen

class Student(object):
    name = None
    matno = None
    def __init__(self, betreuerPersNummer, name, matno):
        self.name = name
        self.matno = matno
        self.betreuer = betreuerPersNummer
        
        
class Tutor(Student):
    persNummer = None
    def __init__(self, persNummer):
        self.studentenListe = []
        self.persNummer = persNummer
Ich glaube Du hast das mit den Klassenvariablen noch nicht so richtig verstanden. Bei beiden Klassen hast Du alle Instanz-Attribute nochmal als Klassenattribute angegeben. Alles was Du mit `None` initialisierst wird nie benutzt und kann weg.

Ausserdem kannst Du gar keinen `Tutor` mit Namen und Matrikelnummer anlegen weil da keine Parameter in der `__init__()` Methode vorgesehen sind.
Jetzt ist mein Problem, dass der Tutor in Student anhand seiner personalnummer identifiziert wird.(das soll so sein Aufgabenstellung :D)
Aber ich weiss nicht, wie ich jetzt beim erstellen einer Instanz von Student, den Studenten automatisch in die studentenListe von Tutor eintragen kann...
Muss das denn beim erstellen der Instanz passieren? Wenn jeder `Student` einen `Tutor` haben muss, dann bekommst Du spätestens dann Probleme wenn der erste `Tutor` erstellt wird und noch kein anderer da ist, der ihn betreut. Man könnte der `__init__()` Methode vom `Student` eine `Tutor` Instanz mitgeben aus der er sich dann die Personalnummer holt und eine Methode auf `Tutor` aufruft um sich selbst in die Studentenliste einzutragen.
JROppenheimer
User
Beiträge: 13
Registriert: Mittwoch 7. Dezember 2005, 09:17
Wohnort: FFM

Das Problem ist: Ich hab schon in einem anderen Post drüber disktuiert, was Klassn und was Instanzattribute sind. ICH PERSÖNLICH sehe Namen und sowas auch als Instanzattribute an. 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?!)

In der Aufgabe sollten wir Name und Matrikelnummer als KLassenattribut einfügen (was wie ich finde ziemlicher quatsch ist)

Ich dachte, dass wenn ich "bla = None" schreibe, dass die Variable schon angelegt wird, o.ä.

Und dass der Betreuer namen und Matrikelnummer nciht hat...? Ich kann doch Tutor.name und Tutor.matno auch hinterher noch definieren, oder?!

Aber ich bin ja für jegliche Kritik offen :D

gruß Timmy
YOU NO MESS WITH LO WANG!
BlackJack

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
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Die Frage ist: Willst du unbedingt, dass es eine Liste im Tutor seiner "untergebenen" gibt?
Da das alle über die Nummer laufen soll, braucht man ein globales dictionary, in dem man jedes studenten-object mit der nummer finden kann
Das würde heißen:
- Man kann vom Studenten nicht auf den Tutor kommen
- Man kann leicht die Studenten zu einem tutor finden

Oder statt dessen nur beim Studenten den Tutor abspeichern:
- Man kann vom Studenten leicht auf den Tutor kommen, aber umgekehrt ist hier umständlich

Oder beides:
- Man kann einfach hin- und her schließen, dafür muss man ein bisschen aufpassen, dass alles konsistent bleibt.

Hier mal letztere Möglichkeit, aber noch unvollständig, d.h. es werden noch in einigen Situationen Inkonsistenzen auftauchen:

Code: Alles auswählen


students = {}

class Student(object):
  def __init__(self, matno, name="", betreuer=None):
     self.name = name
     self.matno = matno
     self.betreuer = betreuer
     students[matno] = self # TODO: check if already there

     if not betreuer is None:
       # Create my tutor if not already there
       if not students.has_key(betreuer):
         students[betreuer] = Tutor(betreuer)
       students[betreuer].studs.append(matno)

class Tutor(Student):
   def __init__(self, matno, name=""):
      super(Tutor, self).__init__(matno, name)
      self.studs = []
Antworten