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.
Tatsächlich kann eine Klasse in Python auch mehrere Oberklassen haben. In den meisten anderen Objekt-orientierten Sprachen ist das aber nicht erlaubt. ↩︎