Also mir gefällt ja das Taschenrechnerbeispiel nicht so wirklich. Von Funktionen kommend würde das so nicht entstehen, weil diese Funktionen so niemand schreiben würde. Man muss also OOP schon drauf haben um das so zu schreiben und es gibt keinen ”Schritt” von Nicht-OOP zu OOP, den man da nachvollziehen könnte. ”Historisch” ist das ja eher so das Objekte aus einem Verbunddatentyp (``RECORD`` in Pascal, ``TYPE`` in BASIC, ``struct`` in C) entstanden sind. Der OP kommt ja aus einer Sprache mit GOTO-Anweisung.
Sinnvoller aus der Ecke kommend ist IMHO eher ein Beispiel wo Funktionen verwendet werden, da aber mittlerweile zu viele Einzelwerte herum gereicht werden müssen, so dass man die sinnvoll zu einem Verbunddatentyp zusammenfassen kann/sollte, und wo man dann einen der Vorteile zeigen könnte die dadurch entstehen, dass man die Funktionen die darauf operieren mit in den Datentyp hineinzieht. Das wäre also Polymorphie als einfachster Vorteil. Blöderweise braucht man in Python schon Klassen wenn man das gar nicht braucht, weil das der einzige Verbunddatentyp ist. Andererseits macht es natürlich auch Sinn dafür keinen eigenen Typ einzuführen, wenn Klassen ja auch diese „plain old data“ (POD)/passive Datenstrukturen abdecken können, und letztlich in Python ja *jeder* Datentyp durch eine Klasse repräsentiert wird, ja werden muss.
OOP-Beispiele haben in der Regel das Problem, dass sie entweder sehr künstlich sind, und sich der Anfänger fragt, warum macht man dass, oder sie sind schon recht komplex, und überfordern damit Anfänger. Was in der Natur der Sache liegt, weil die Aufgabe OOP ist Komplexität zu organisieren und handhabbar zu halten. Wenn in dem Beispiel keine Polymorphie oder Vererbung vorkommt, dann ist es IMHO kein OOP-Beispiel, denn das könnte man dann auch genau so gut ohne OOP lösen.
Zurück zum Taschenrechnerbeispiel, das man in QBasic beispielsweise mit Verbunddatentyp und Prozeduren so schreiben würde:
Code: Alles auswählen
TYPE TTaschenrechner
register AS INTEGER
END TYPE
SUB TaschenrechnerInit (rechner AS TTaschenrechner)
rechner.register = 0
END SUB
SUB TaschenrechnerLadeRegister (rechner AS TTaschenrechner, zahl AS INTEGER)
rechner.register = zahl
END SUB
SUB TaschenrechnerAddiere (rechner AS TTaschenrechner, zahl AS INTEGER)
rechner.register = rechner.register + zahl
END SUB
SUB TaschenrechnerAusgabe (rechner AS TTaschenrechner)
PRINT rechner.register
END SUB
DIM rechner AS TTaschenrechner
TaschenrechnerInit rechner
TaschenrechnerLadeRegister rechner, 1
TaschenrechnerAddiere rechner, 2
TaschenrechnerAusgabe rechner
Das sieht so schon nicht sinnvoll aus, und das auf Pseudo-OOP zu erweitern taugt IMHO nicht jemandem den Sinn von OOP näher zu bringen. Das hat keinen wirklichen Vorteil gegenüber:
Code: Alles auswählen
DIM register AS INTEGER
register = 0
register = 1
register = register + 2
PRINT register
Und das könnte man noch weiter vereinfachen.