Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| modul:m320_2024:learningunits:lu09:mehrfachbeziehung [2024/09/18 14:02] – msuter | modul:m320_2024:learningunits:lu09:mehrfachbeziehung [2024/09/23 09:11] (aktuell) – msuter | ||
|---|---|---|---|
| Zeile 10: | Zeile 10: | ||
| //Abb: 1:n Beziehung// | //Abb: 1:n Beziehung// | ||
| - | {{: | ||
| - | |||
| - | //Abb: n:n Beziehung// | ||
| === Kardinalität === | === Kardinalität === | ||
| Zeile 26: | Zeile 23: | ||
| Der Stern steht für **0 bis unendliche viele** Beziehungen. | Der Stern steht für **0 bis unendliche viele** Beziehungen. | ||
| In der UML ist es aber auch möglich, die Kardinalität ganz genau zu spezifizieren. | In der UML ist es aber auch möglich, die Kardinalität ganz genau zu spezifizieren. | ||
| - | So ist in der Abbildung | + | So ist in der Abbildung klar erkennbar, dass eine Schulklasse mindesten 15 aber maximal 24 Studenten haben kann. |
| - | === Umsetzung in Python === | + | ===== Umsetzung in Python |
| Kennt ein Objekt viele andere, gleichartige Objekte, werden die Referenzen in einer Liste festgehalten. | Kennt ein Objekt viele andere, gleichartige Objekte, werden die Referenzen in einer Liste festgehalten. | ||
| - | In der Regel wird die Methode für das **Zufügen** als **add**-Methode bezeichnet. | + | Ein einheitlicher Prefix bei den Methodennamen hilft bei der Orientierung. |
| - | Gegenüber dem Begriff **set** signalisiert **add**, dass eben mehrere Werte gesetzt werden können. | + | * Die Methode für das **Zufügen** |
| + | * Die Methode für das **Zählen** der Listeneinträge wird als **count**-Methode bezeichnet. | ||
| + | * Die Methode um ein Element **abzufragen** wird als **take**-Methode bezeichnet. | ||
| + | * Die Methode für das **Löschen** wird als **remove**-Methode bezeichnet. | ||
| Für die oben dargestellte Klasse '' | Für die oben dargestellte Klasse '' | ||
| + | ==== Beziehungen hinzufügen (**add**)==== | ||
| <code python> | <code python> | ||
| class SchoolClass: | class SchoolClass: | ||
| - | + | | |
| - | | + | |
| - | | + | |
| - | | + | |
| | | ||
| - | | + | |
| - | | + | if len(self._students) < 24: |
| - | self._students.append(a_student) | + | self._students.append(a_student) |
| </ | </ | ||
| - | Weitere wichtige Methoden dienen | + | === Duplikate vermeiden === |
| - | * dem **Abfragen** der Grösse der Liste (Anzahl der gespeicherten Objekte) | + | Die Methode '' |
| - | * dem **Abrufen** einer Referenz über einen Index. Dieser muss aber gegen die '' | + | Dazu prüfen wir zunächst, ob das '' |
| - | * dem **Entfernen** einer Referenz aus der Liste | + | |
| + | <code python> | ||
| + | ... | ||
| + | | ||
| + | if not a_student in self._students: | ||
| + | if len(self._students) < 24: | ||
| + | self._students.append(a_student) | ||
| + | </ | ||
| + | |||
| + | ==== Anzahl Listeneinträge abfragen (**count**) ==== | ||
| + | Diese Property liefert die Grösse | ||
| <code python> | <code python> | ||
| @property | @property | ||
| def count_students(self): | def count_students(self): | ||
| | | ||
| - | + | </ | |
| - | def take_student(self, | + | |
| + | ==== Lesen eines Objekts (**take**) ==== | ||
| + | Diese Methode dient dazu, ein bestimmtes Element aus der Liste zu lesen. | ||
| + | Dies erfolgt entweder ... | ||
| + | * ... über den Index des Listenelements | ||
| + | * ... einen eindeutigen Wert (Key) | ||
| + | |||
| + | |||
| + | <code python> | ||
| + | def take_student(self, | ||
| + | if index is not None: # Index wurde angegeben | ||
| if index < len(self._students): | if index < len(self._students): | ||
| - | return self._students[index] | + | |
| else: | else: | ||
| - | raise StudentIndexError(' | + | |
| - | | + | |
| - | def remove_student(self, | + | for student in self._students: |
| + | if student.name == key: | ||
| + | return student | ||
| + | return None | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Löschen einer Beziehung (**remove**) ==== | ||
| + | Diese Methode dient dazu, ein bestimmtes Element aus der Liste zu löschen. | ||
| + | Dies erfolgt entweder ... | ||
| + | * ... über den Index des Listenelements | ||
| + | * ... einen eindeutigen Wert (Key) | ||
| + | |||
| + | <code python> | ||
| + | def remove_student(self, | ||
| + | if index is not None: # Index wurde angegeben | ||
| if index < len(self._students): | if index < len(self._students): | ||
| - | self._students.remove(index) | + | |
| else: | else: | ||
| raise StudentIndexError(' | raise StudentIndexError(' | ||
| + | else: # kein Index angegeben, wir suchen nach dem Namen | ||
| + | for idx, student in enumerate(self._students): | ||
| + | if student.name == key: | ||
| + | self._students.remove(idx) | ||
| </ | </ | ||
| + | <WRAP center round tip 60%> | ||
| + | Je nach Entwurf der Applikation können die **take**- und **remove**-Methoden auch nur einen der Parameter '' | ||
| + | </ | ||
| ---- | ---- | ||