Klasse (Informatik)

Aus KGS-Wiki

Eine Klasse in einem UML-Klassendiagramm

Eine Klasse dient in vielen Programmiersprachen als Bauplan für Objekte. Durch den Aufbau der Klasse wird festgelegt, welche Attribute und Methoden ein Objekt haben kann. Die konkrete Ausprägung dieser Attribute und die Ergebnisse der Methodenausführung bleiben den Objekten selbst überlassen. Die Klasse legt nur fest, wie die Objekte aussehen können und welches Verhalten man von ihnen erwarten darf.

Zum Beispiel legt die Python-Klasse str fest, dass alle str-Objekte, also Strings, eine Methode namens isnumeric() enthalten, die die Information liefert, ob dieser String numerisch ist. Das Ergebnis des Methodenaufrufs ist natürlich von dem String abhängig, auf dem es aufgerufen wird.

>>> string1 = 'Hello World!'
>>> string2 = '42'
>>> string3 = str()
>>> string1.isnumeric()
False
>>> string2.isnumeric()
True
>>> string3.isnumeric()
False

In so genannten streng getypten Sprachen wie Java muss beim Programmieren für jedes Objekt festgelegt werden, welchen Datentyp es hat. Dadurch kann schon beim Kompilieren überprüft werden, ob alle aufgerufenen Methoden auch für die entsprechenden Objekte existieren. In dynamisch getypten Sprachen wie Python ist dies erst möglich, wenn das Programm läuft.

Klassendefinition

In Python definiert man Klassen mit dem Schlüsselwort class und kann dann die Attribute und Methoden festlegen. Der folgende Beispiel-Code zeigt eine Klasse, die Brüche beschreibt:

# Hier beginnt eine neue Klasse namens Bruch
class Bruch:

    # Diese Funktion heißt Konstruktor.
    # Sie enthält die Anweisungen, die ausgeführt werden,
    # wenn ein neues Objekt von dieser Klasse erzeugt wird.
    # In diesem Konstruktor wird zum Beispiel festgelegt,
    # dass ein neuer Bruch unter Angabe von Zähler und
    # Nenner definiert werden muss.
    #
    # Das Schlüsselwort self verweist dabei auf das Objekt,
    # das gerade erzeugt wird.
    #
    # Die Klasse Bruch hat die Attribute self.zaehler und
    # self.nenner, die im Konstruktor festgesetzt werden.
    def __init__(self, zaehler, nenner):
        self.zaehler = zaehler
        self.nenner = nenner
        
    # Ab hier werden die Methoden der Klasse definiert:
    # Alle Brüche können miteinander addiert, subtrahiert,
    # multipliziert und dividiert werden.
    
    # Addiere zwei Brüche: a/b + c/d = (ad+bc)/(bd)
    def addiere(self, other):
        self.zaehler = (self.zaehler * other.nenner) + (other.zaehler * self.nenner)
        self.nenner = self.nenner * other.nenner
        
    # Subtrahiere zwei Brüche: a/b + c/d = (ad+bc)/(bd)
    def subtrahiere(self, other):
        self.zaehler = (self.zaehler * other.nenner) - (other.zaehler * self.nenner)
        self.nenner = self.nenner * other.nenner
        
    # Multipliziere zwei Brüche: a/b * c/d = ac/bd
    def multipliziere(self, other):
        self.zaehler = self.zaehler * other.zaehler
        self.nenner = self.nenner * other.nenner
        
    # Dividiere zwei Brüche: a/b : c/d = ad/bc
    def dividiere(self, other):
        self.zaehler = self.zaehler * other.nenner
        self.nenner = self.nenner * other.zaehler

Nun kann man Objekte von dieser Klasse erzeugen. Hier werden zwei Brüche a=12 und b=13 erzeugt und addiert. Das Ergebnis ist a=56.

>>> a = Bruch(1,2)
>>> b = Bruch(1,3)
>>> a.addiere(b)
>>> a.zaehler
5
>>> a.nenner
6