Vererbung

Zur Definition konkreter geometrischer Figuren verwenden wir eine andere Art der hierarchischen Modularisierung, nämlich Vererbung. Vererbung erlaubt es Gemeinsamkeiten unterschiedlicher Klassen in Oberklassen zusammenzufassen und dann in Unterklassen auf diese zurückzugreifen. Zum Beispiel haben alle geometrischen Figuren, die wir definieren werden, einen Punkt, an dem sie gezeichnet werden sollen, gemeinsam. Alle Klassen zur Darstellung geometrischer Figuren erben deshalb die entsprechenden Methoden (und den zugehörigen Zustand) von der Klasse Shape.

Als Beispiel definieren wir die Klasse Circle als Unterklasse der Klasse Shape.

class Circle(Shape):
    def __init__(self, center, radius):
        super().__init__(center)
        self.set_radius(radius)
    
    def radius(self):
        return self._radius
    
    def set_radius(self, radius):
        if type(radius) == int:
            self._radius = radius
    
    def center(self):
        return self.location()
    
    def set_center(self, point):
        self.set_location(point)

Die Klassendefinition von Circle hat hier einen Parameter Shape in runden Klammern, wodurch festgelegt wird, dass Circle eine Unterklasse von Shape ist.

Der Methode __init__ der Klasse Circle müssen der Kreismittelpunkt und der Radius übergeben werden. Der Mittelpunkt wird mit Hilfe des Aufrufs super().__init__(center) an die __init__-Methode der Oberklasse Shape übergeben, welche diesen im Attribut _location speichert. Der Radius wird mit Hilfe der Methode set_radius im Attribut _radius gespeichert.

Die Definition der Methode __init__ überschreibt die Definition der gleichnamigen Methode der Klasse Shape. Beim Aufruf von __init__ auf einem Circle-Objekt wird also die neue Implementierung verwendet statt der alten. Die alte Implementierung kann mit Hilfe von super() aufgerufen werden, wie das obige Beispiel zeigt.

Circle-Objekte verfügen über alle Methoden von Shape-Objekten, wie die Methoden center und set_center zum Zugriff auf den im Attribut _location der Oberklasse gespeicherten Mittelpunkt zeigen.

In der Regel wird Vererbung verwendet, um hierarchische Zusammenhänge der definierten Klassen auszudrücken. Zum Beispiel ist jeder Kreis (Circle) eine Figur (Shape) und jede Instanz der Klasse Circle ist (indirekt) auch eine Instanz der Klasse Shape. Solche Zusammenhänge leiten die Definition komplexerer Klassenhierarchien. Da jede Klasse nur eine Oberklasse aber mehrere Unterklassen hat1, ergibt sich dadurch eine Baumstruktur. Klassen ohne explizite Oberklasse erben von der vordefinierten Klasse object, die also die Wurzel der Baumstruktur aller definierten Klassen ist.


  1. Tatsächlich kann eine Klasse in Python auch mehrere Oberklassen haben. In den meisten anderen Objekt-orientierten Sprachen ist das aber nicht erlaubt. ↩︎