Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| de:modul:m320_2024:learningunits:lu02:datahiding [2026/08/30 14:05] – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | de:modul:m320_2024:learningunits:lu02:datahiding [2026/08/30 14:06] (aktuell) – ↷ Links angepasst, weil Seiten im Wiki verschoben wurden msuter | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== LU02b - Konzept des data hiding ====== | ||
| + | <WRAP center round tip 60%> | ||
| + | Unter **data hiding** (Datenkapselung) versteht man den Zugriff auf die Attribute eines Objektes nur mittels Methoden und nie im Direktzugriff [[https:// | ||
| + | </ | ||
| + | |||
| + | Im UML-Diagramm werden daher die Attribute mit dem Modifikator << | ||
| + | |||
| + | {{modul: | ||
| + | |||
| + | //Abb. private-Modifikator in UML// | ||
| + | |||
| + | Was bedeutet nun aber data hiding praktisch betrachtet? | ||
| + | |||
| + | Wir nehmen hier wieder unser Beispiel der Türe. | ||
| + | Gemäss UML-Diagramm sind alle Attribute '' | ||
| + | <code Python> | ||
| + | some_door = Door() | ||
| + | some_door.door_is_open = True | ||
| + | </ | ||
| + | |||
| + | ist somit nicht erlaubt. | ||
| + | Wäre dem nicht so, könnte z.B. auch im Zustand '' | ||
| + | Viel mehr wird in der Methode '' | ||
| + | |||
| + | |||
| + | <code Python> | ||
| + | def lock_the_door(self): | ||
| + | """ | ||
| + | Methode für das verriegeln der Türe. | ||
| + | Das ist nur möglich, wenn die Türe nicht offen ist. | ||
| + | Für das verriegeln ist aber das Türschloss zuständig. Es weiss wie das geht. | ||
| + | """ | ||
| + | if self._door_is_open == False: | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Der Benutzer der Klasse '' | ||
| + | Es genügt, wenn er die passenden Methode aufruft. Hier also | ||
| + | <code Python> | ||
| + | some_door.lock_the_door() | ||
| + | </ | ||
| + | |||
| + | ===== data hiding bei Python ===== | ||
| + | ==== Attribute ==== | ||
| + | |||
| + | Attribute die im Klassendiagramm als '' | ||
| + | Dies erfolgt durch folgende Schreibweise | ||
| + | <code Python> | ||
| + | self._attributname = initial_wert | ||
| + | </ | ||
| + | |||
| + | <WRAP center round info 60%> | ||
| + | Im Gegensatz zu anderen Programmiersprachen gibt es in Python keine echten **private** Attribute. | ||
| + | Mit der Schreibweise '' | ||
| + | Es wird aber nicht durch den Python-Interpreter verhindert, dass trotzdem auf solche Attribute zugegriffen wird. | ||
| + | </ | ||
| + | |||
| + | ==== Property und Setter ==== | ||
| + | Durch den Einsatz von '' | ||
| + | Als Beispiel betrachten wir das Attribut '' | ||
| + | |||
| + | <code python [enable_line_numbers=" | ||
| + | class Door: | ||
| + | def __init__(self, | ||
| + | self.color = base_color | ||
| + | |||
| + | @property | ||
| + | def color(self): | ||
| + | """ | ||
| + | getter-Methode für die Eigenschaft color | ||
| + | :return: die Farbe des Objekts | ||
| + | """ | ||
| + | return self._color | ||
| + | |||
| + | @color.setter | ||
| + | def color(self, new_color): | ||
| + | """ | ||
| + | setter-Methode für die Eigenschaft color | ||
| + | :param new_color: | ||
| + | """ | ||
| + | self._color = new_color | ||
| + | | ||
| + | if __name__ == ' | ||
| + | some_door = Door(None, ' | ||
| + | print(f' | ||
| + | some_door.color = ' | ||
| + | print(f' | ||
| + | </ | ||
| + | |||
| + | Auf den ersten Blick scheint es, als würde das Programm in Zeile 24 direkt auf das Attribut '' | ||
| + | Tatsächlich erkennt Python die Decorators '' | ||
| + | |||
| + | ---- | ||
| + | [[https:// | ||