Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| modul:archiv:m320:learningunits:lu99:theorie:lu8-kapitel_3 [2026/08/30 14:06] – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | modul:archiv:m320:learningunits:lu99:theorie:lu8-kapitel_3 [2026/08/30 14:09] (aktuell) – ↷ Links angepasst, weil Seiten im Wiki verschoben wurden 74.7.243.195 | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ==== 2. Interface in Python ==== | ||
| + | Schnittstellen spielen im Software Engineering eine wichtige Rolle. Wenn eine Anwendung wächst, werden Aktualisierungen und Änderungen an der Codebasis immer schwieriger zu verwalten. Hier erfahren Sie, wie Sie eine // | ||
| + | \\ | ||
| + | Grundsätzlich kann eine Schnittstelle als **Vertrag** verstanden werden. Sie definiert eine gewisse Funktionalität durch Methoden. Im Interface wird die Deklaration ohne Implementation festgehalten. (Anmerkung: man spricht oft auch von vollabstrakten Klassen, so z.B. bei C++)\\ | ||
| + | Diese Funktionalität wird für die korrekte Funktion der Anwendung vorausgesetzt. Die implementierende Klasse nutzt die Deklaration der Schnittstelle, | ||
| + | ---- | ||
| + | //Beispiel 7.3:// Objekte mit gleichartiger Funktionalität\\ | ||
| + | Verschieden Objekte, die keine Beziehung zueinander aufweisen müssen, haben eine ähnliche Funktionalität, | ||
| + | {{modul: | ||
| + | //Abb. 7.2:// Klassen mit sinngleicher Funktionalität\\ | ||
| + | \\ | ||
| + | Obwohl die drei Klassen Mensch, Wasserflugzeug und Baum keine gemeinsame Basis (Oberklasse) haben, weisen alle die Fähigkeit '' | ||
| + | {{modul: | ||
| + | //Abb. 7.3: // | ||
| + | \\ | ||
| + | Beachten Sie hier die Darstellung einer Schnittstellen-Beziehung als strichlierte Linie (im Gegensatz zur Vererbung mit durchgezogener Linie).\\ | ||
| + | {{modul: | ||
| + | //Abb. 7.4: // | ||
| + | ---- | ||
| + | Das Beispiel verdeutlicht, | ||
| + | <code python> | ||
| + | a_human_object = Human(" | ||
| + | a_human_object.swim() | ||
| + | ··· | ||
| + | a_plane_object = Seaplan(" | ||
| + | a_plane_object.swim() | ||
| + | ··· | ||
| + | a_tree_object = Tree(" | ||
| + | a_tree_object.swim() | ||
| + | </ | ||
| + | Werden diese verschiedenen Objekte in einer Liste eingetragen, | ||
| + | Dieses Verhalten entspricht der Idee der Polymorphie. In Pyton wird das konkret mittels Duck-Typing umgesetzt. | ||
| + | |||
| + | === Das Duck-Typing === | ||
| + | Python kennt das Konstrukt des Interface nicht. Es wird ersetzt durch die Technik des // | ||
| + | |||
| + | Der Name // | ||
| + | <color # | ||
| + | |||
| + | === Wozu Duck-Typing verwenden? === | ||
| + | Dank // | ||
| + | Das // | ||
| + | |||
| + | === Wie wird Duck-Typing verwendet? | ||
| + | Beim Duck-Typing werden beliebige Objekte in einer Liste gesammelt. Wird die Liste traversiert (mit einer for-Schleife), | ||
| + | |||
| + | ---- | ||
| + | //Beispiel 7.4:// Umsetzung einer psydo Schnittselle mit Duck-Typing | ||
| + | <file python> | ||
| + | class People: | ||
| + | def swim(self): | ||
| + | print(' | ||
| + | |||
| + | class Tree: | ||
| + | def swim(self): | ||
| + | print(' | ||
| + | |||
| + | class Aeroplane: | ||
| + | def swim(self): | ||
| + | print(' | ||
| + | |||
| + | class Machine: | ||
| + | pass # kann nicht schwimmen | ||
| + | |||
| + | |||
| + | if __name__ == ' | ||
| + | print(' | ||
| + | |||
| + | container = [] | ||
| + | container.append(People()) | ||
| + | container.append(Tree()) | ||
| + | container.append(Aeroplane()) | ||
| + | container.append(Machine()) | ||
| + | |||
| + | for obj in container: | ||
| + | if hasattr(obj, | ||
| + | obj.swim() | ||
| + | </ | ||
| + | |||
| + | Das Programm liefert folgende Ausgabe: | ||
| + | |||
| + | < | ||
| + | schwimmen wie ein Mensch | ||
| + | schwimmen wie ein Baumstamm | ||
| + | schwimmen wie ein Wasserflugzeug | ||
| + | </ | ||
| + | ---- | ||
| + | |||
| + | Der Grund dafür liegt darin, dass Python als dynamische Sprache bei Methoden mit derselben Signatur so tut, also ob dafür eine Schnittstelle vorhanden wäre. | ||
| + | Das passiert automatisch und implizit (=versteckt). Wie bereits erwähnt, wird daher in diesem Zusammenhang von einer // | ||
| + | ---- | ||
| + | //Beispiel 7.5:// Informelle Schnittstelle\\ | ||
| + | {{modul: | ||
| + | //Abb. 7.5:// Die Schnittstelle '' | ||
| + | |||
| + | ---- | ||
| + | [[https:// | ||
| + | \\ | ||
| + | **Quellen**: | ||