Bei einer zweiseitigen Beziehung kennt ein Objekt A ein anderes Objekt B und umgekehrt.
Abb: Klassen in einer zweiseitigen Beziehung
Es ist offensichtlich, dass eine Lehrperson nicht zu jedem Student und umgekehrt nicht jeder Student zu einer Lehrperson eine Beziehung pflegen muss. Wie im vorherigen Beispiel müssen daher auch hier die Objekte nicht zwingend eine Referenz zu einem anderen Objekt kennen, um existieren zu können. Es macht Sinn, die Zuweisung dann zu machen, wenn sie benötigt wird.
Um sicherzugehen, dass immer eine zweiseitige Beziehung besteht, wird in der jeweiligen «setter»-Methode gleich auch die „Rückbeziehung“ gesetzt.
Hinweis: Programmtechnisch muss einfach sichergestellt werden, dass eine schon bestehende Beziehung nicht noch einmal zugewiesen wird.
class Teacher: def __init__(self, name): self._name = name self._student = None @student.setter def student(self, student): self._student = student student.teacher = self class Student: def __init__(self, name): self._name = name self._teacher = None @teacher.setter def teacher(self, teacher): self._teacher = teacher teacher.student = self if __name__ == '__main__': mia = Teacher('Mia') cathy = Student('Cathy') #ENTWEDER mia.student = cathy #ODER cathy.teacher = mia
Abb: Klassen in einer zweiseitigen Beziehung
Ein Student wird bei der Anmeldung einer Klasse zugewiesen.
Daher macht es Sinn, diese Referenz über den Konstruktor mitzuteilen.
Dabei muss die Klasse SchoolClass
zeitlich vorher erstellt werden, damit die Referenz verfügbar ist.
class SchoolClass: def __init__(self, designation): self._designation = designation self._student = None @student.setter def student(self, student): self._student = student class Student: def __init__(self, name, the_class): self._name = name self._class = the_class the_class.student = self if __name__ == '__main__': i1a = SchoolClass('I1a') cathy = Student("Cathy", i1a)