OOP ist nichts weiter als eine Abkürzung für objektorientiertes Programmieren, das heisst das »Programmieren mit Klassen«. Das Gegenteil davon heisst prozedurales Programmieren.
Warum reicht das gewöhnliche, prozedurale Programmieren nicht aus?
Die Abbildungen
und
zeigen Ihnen den Unterschied. Beim prozeduralen Programmieren wuseln
Anweisungen und Funktionen zwischen verschiedenen Datenobjekten hin
und her wie Wasserläufer auf einem See zwischen den Orten, wo sich
gerade eine Beute zeigt. Schon dieses kleine Bild zeigt, dass der
Programmierer dabei sehr schnell den Überblick verlieren kann. Ausserdem
ist nicht gewährleistet, dass nicht versehentlich die falsche Funktion
für das falsche Objekt verwendet wird.
Beim objektorientierten Programmieren sind die Funktionen in einer Klasse eingesperrt und verrichten nur dort ihre Arbeit. Es ist durchaus Absicht, dass in der Abbildung keine Anweisungen innerhalb der Klasse eingezeichnet sind, denn alles sollte in einer Klasse als Funktion (Methode) vorliegen! Diese Methoden geben einem Klassenobjekt sozusagen ein Eigenleben. Zwischen den Klassenobjekten bewegen sich weder Anweisungen noch Funktionen, sondern es werden lediglich Daten als Nachrichten ausgetauscht. Die Klassenobjekte (Instanzen) kommunizieren über den self-Parameter miteinander. Dieser self-Parameter ist mit dem Namen der Instanz identisch5.3 und ist symbolisch in der Abbildung mit dem Rahmen der Klasse verbunden. Welche Inhalte der Instanz an dem Datenaustausch beteiligt sein können, zeigt Ihnen die Abbildung durch die gestrichelten Linien, die von den einzelnen Elementen zum Rahmen und damit zum self-Parameter führen. Fehlt diese Verbindung, so ist nimmt der entsprechende Datensatz oder die Methode an dem Nachrichtenaustausch nicht teil.
Ein weiterer unglaublicher Vorteil des OOP ist die Vererbung. Die
Abbildung
zeigt sogar
eine Mehrfachvererbung.
Nehmen Sie an, Sie wollen ein Programm verbessern und kennen die Art und Weise wie die Methoden der Klassen canna und cbernd arbeiten. Sie kennen aber nicht den Code! Sie sind dann in der Lage, sich eine eine neue Klasse ccarina zu erstellen, die zunächst alle Eigenschaften der Klassen canna und cbernd enthält. Die entsprechende Zuweisung class ccarina(canna,cbernd): legt diese Klasse durch Vererbung an.
Wenn Ihnen die Funktion f so wie sie in canna arbeitet, nicht gefällt, verschaffen Sie sich eine neue, in dem Sie lediglich den Code für die Funktion f in ccarina völlig neu schreiben. Die Abbildung zeigt aber auch, dass es bei Mehrfachvererbung zu Problemen kommen kann. Während der Funktionsname f in den Klassen canna und cbernd eindeutig war, ist dies nach der Vererbung in ccarina nicht mehr der Fall! Die von cbernd übernommene Funktion muss einen anderen Namen bekommen, und zwar schon in cbernd, da sonst in ccarina ein Namenskonflikt mit der aus anna übernommenen Funktion existiert. Bei Mehrfachvererbungen muss der Programmierer also höllisch aufpassen!
Neben der Überschreibung (=Überladung) von Methoden gibt es auch die Überladung von Operatoren, wie zum Beispiel + oder *. Für diese Überladung schreiben Sie Funktionen mit speziell definierten Namen, die mit zwei Unterstrichen beginnen und mit zwei Unterstrichen aufhören. Für das Überladen von + heisst die zugehörige Funktion immer __add__, für das Überladen von * dagegen __mul__. Sie erinnern sich sicherlich noch an __init__. Dies ist die Funktion, mit der sie den Objektkonstruktor überladen können. Wenn Sie es von aussen steuern wollen, wie die über self ansprechbaren Datensätze belegt werden sollen, benötigen Sie immer eine __init__-Methode.
Nun sieht es auf den ersten Blick so aus, als ob OOP das Allheilmittel sei. Was das grafische Programmieren betrifft, so mag dies auch richtig sein. Aber für ein Erstellen einfacher Algorithmen, die in erster Linie mathematische Probleme lösen sollen, ist OOP in der Regel eine Kanone, die auf Spatzen gerichtet ist. In diesem Fall ist prozedurales Programmieren vorzuziehen. Es ist das Schöne, dass man in Python nicht zu OOP gezwungen wird (wie zum Beispiel bei Java), sondern sehr wohl auch prozedural programmieren kann. Man sollte es aber auf jeden Fall vermeiden, eine Mischung beider Programmierarten zu akzeptieren!
OOP erfordert ein sehr viel sorgfältigeres Überlegen und Designen, bevor die erste Programmierzeile geschrieben wird.