6. Objektorientiertes Programmieren

In den Programmen des Themengebierts »Programmieren mit Python« wurden grafische Benutzeroberflächen – Graphical User Interfaces – erstellt. Dabei wurde – bewusst oder unbewusst – bereits objektorientiert programmiert. Allerdings mussten keine eigenen Klassen deklariert werden, da das Modul »tkinter« die erforderlichen Klassen bereitstellt, u. a. die Klassen Tk(), Canvas, Label, Button und Entry(). Die bereitgestellten Klassen und deren Methoden mussten einzig angewandt werden.

Der Abschluss des Themengebiets bietet im Nachhinein einen kurzen Einblick in das Paradigma der objektorientierten Programmierung.

Paradigma des objektorientierten Programmierens

Mit dem Paradigma (der Denkweise) des objektorientierten Programmierens sind die Begriffe Klasse, Objekt, Referenzvariable sowie Botschaft verbunden.

Definition
Begriff »Klasse«

Eine Klasse ist ein Objekttyp. Von der Klassen werden als Instanzen Objekte erzeugt.

Die Besonderheit ist, dass die Objekte der Klasse jederzeit während des Programmablaufs im dynamischen Speicherbereich »Heap« des Arbeitsspeichers RAM entstehen und vergehen können.[1]

Bild 124
Abbildung 1: Eine Referenzvariable verweist auf ein Objekt

In den Namen der Klassen wird der erste Buchstabe großgeschrieben, wie beispielsweise in der Klasse »Canvas«).[2]

Das Modul »tkinter« stellt die Klassen zum Erzeugen einer grafischen Benutzeroberfläche GUI – dem Hauptfenster mit darauf platzierten Widgets – bereit.
Aus diesem Grund wird an dieser Stelle nicht auf das Deklarieren (eigener) Klassen eingegangen.

Definition
Begriff »Objekt«

Ein Objekt ist die Instanz (eines Objekttyps) einer Klasse.

In dem Objekt sind die Daten und Methoden[3] zum einen gekapselt (Kapselung) und zum anderen durch das Geheimnisprinzip (Information Hiding) nach außen geschützt.

  • Die Daten bestimmen die Eigenschaften des Objekts.
  • Die Methoden bestimmen das Verhalten des Objekts.

Mit dem Objekt kann von außen einzig per Botschaften über dessen Schnittstellen kommuniziert werden.

Definition
Begriff »Reverenzvariable«

Auf das Objekt verweist eine Referenzvariable (Pointer bzw. dt. Zeiger).

Der Wert der Referenzvariable ist die Basisadresse des Objekts im dynamischen Speicherbereich »Heap« des Arbeitsspeichers RAM (Abbildung 1).

Es ist wichtig, zwischen dem Objekt und der Referenzvariablen – die auf das Objekt verweist – zu unterscheiden.

  • Die Reverenzvariable ist nicht das Objekt.

In den Namen der Referenzvariablen wird der erste Buchstabe kleingeschrieben,
wie beispielsweise in der Referenzvariable »canvas« (im Unterschied zur Klasse »Canvas«)[2]

Definition
Begriff »Botschaft«

Eine Botschaft an ein Objekt ist der Aufruf einer Methode des Objekts, sodass die Methode ausgeführt wird.

Programm »fenster.py«

In der Abbildung 2 ist die Ausgabe der objektorientiert programmierten grafische Benutzeroberlfläche – das Hauptfenster – dargestellt.

Bild 125
Abbildung 2: Hauptfenster im macOS Design

Das Modul »tkinter« – das u. a. die Klasse »Tk()« enthält – wird in das Programm eingebunden.

import tkinter as tk

Mit der folgenden Anweisung (eine Wertzuweisung) wird das Hauptfenster der grafischen Benutzeroberfläche als Objekt der Klasse »Tk()« erzeugt.

root = tk.Tk()

Der Referenzvariable »root« wird als Wert die Basisadresse des Objekts im dynamischen Speicherbereich des im Arbeitsspeichers (RAM) zugewiesen, wodurch die Referenzvariable »root« auf das Objekt verweist (Abbildung 1).

An das Objekt – auf das die Referenzvariable »root« verweist – werden die Botschaften gesandt.

root=tk.Tk()
root.title("Fenster")
root.geometry("400x200")
root.resizable(False, False)

root.mainloop()

Die Botschaften bewirken, dass die folgenden Methoden aufgerufen und ausgeführt werden.

Tabelle 1: Aufgerufene Methoden
Methoden Erklärungen
title(…) Den Anzeigename des Hauptfensters ändern.
geometrie(…) Die Größe das Hauptfensters festlegen.
resizable(…) Die Größe des Hauptfensters fixieren.
mainloop(…) Die Ereignisschleife im Programm starten.

Interessant ist zudem, dass während der Laufzeit eines Programms die im Heap erzeugten Objekte in regelmäßigen Abständen kontrolliert werden, ob sie noch benutzt werden. Dafür sorgt im Heap der sogenannte Garbage Collector (der Müllman 😉), der im Heap aufräumt, indem er nicht mehr benutzte Objekte löscht, das heißt, deren Speicherplätze zur Wiederverwendung freigibt.

Beispiel Turtle-Objekt

Ein Turtle-Objekt der Klasse »RawTurtle« des Moduls »turtle« wird im Heap erzeugt.

schildi=turtle.RawTurtle(turtle_screen, shape="classic")

Der Referenzvariable »schildi«, wird als Wert die Basisadresse des Turtle-Objekts im Heap zugewiesen. Die Referenzvariable »schildi« ist allerdings nicht das Turtle-Objekt – sondern verweist auf das Turtle-Objekt.

An das Turtle-Objekt – auf das die Referenzvariable »schildi« verweist – werden unter anderem nachfolgende Botschaften gesandt.

  • Die Turtle soll eine Linie zeichen. Das heißt, an des Turtle-Objekt wird von der Referenzvariable »schildi« die Botaschaft gesandt, die Methode »forward(150)« auszuführen.
    schildi.forward(150)
    
    
    Man kann das etwa so verstehen, wie wenn gesagt wird »Peter, laufe 150m geradeaus.«. Peter ist dabei als Name der Verweis auf die Person – die gemeint ist – die 150m geradeaus zu laufen.
  • Die Turtle soll sich um 90° nach rechts drehen. Das heißt, an des Turtle-Objekt wird von der Referenzvariable »schildi« die Botaschaft gesandt, die Methode »right(90)« auszuführen.
    schildi.right(90)
    
    

Soviel zu dem, was bezüglich der Objektorientierung im Zusammenhang mit der Tkinter-Programmierung gewusst werden sollte.


  1. [1] Im statischen Speicherbereich des Arbeitsspeichers (RAM) ist dies nicht möglich.
  2. [2] Wie bereits erwähnt, wird in Python wird streng zwischen Groß- und Kleinschreibung unterschieden.
  3. [3] In der objektorientierten Programmierung werden die Funktionen der Objekte als Methoden bezeichnet.