Glossar zur Objektorientierung mit Python

<== Zur Übersicht der Begriffe ==>


Override [Überschreiben]


Von Überschreiben einer Methode spricht man, wenn in einer erbenden Klasse eine Methode [mit derselben Signatur*)] wie in der vererbenden Klasse [Oberklasse] existiert.
Für alle Instanzen der vererbenden Klasse ersetzt die überschreibende Methode die überschriebene.

Das hat zur Folge, dass auch für Methodenaufrufe von Methoden, die in der Oberklasse beschrieben sind, nicht auf die Methode der Oberklasse, sondern auf die überschreibende Methode zugegriffen wird.

Auf die besondere Bedeutung des Überschreibens bei der Vererbung lesen Sie dort und unter Polymorphie nach.

Überdecken ist kein Überschreiben!

Wichtig zu beachten: Werden in einer erbenden Klasse Variable mit demselben Namen wie Variablen aus der vererbenden Klass deklariert, dann überschreiben sie nicht die Variablen der vererbenden Klasse, sondern sie überdecken sie.

*) Siehe dazu auch Overload


Beispiele für alle Fälle

Für das Überschreiben:

Das Beispielprojekt enthält drei einfache Klassen zum Zählen. Die Oberklasse Zaehler enthält eine einfache Zählmethode, die jeweils um 1 weiterzählt, während die beiden von ihr erbenden Klassen VielZaehler und OderSoZaehler diese Methode durch eine eigene mit veränderbarer Weite überschreiben.

class Zaehler(object):
    '''Erben von object notwendig wegen super'''

    def __init__(self):
        """Konstruktor von Zaehler
        initialisiert die Instanzvariable __stand von Zaehler"""
        self.__stand = 0

    def GibStand(self):
        """Get-Methode fuer den Stand"""
        return self.__stand

    def Zaehle(self):
        """Veraendernde Methode fuer den Stand.
        Diese Methode wird von der erbenden Klasse ueberschrieben."""
        self.__stand += 1 
class OderSoZaehler(Zaehler):

    def __init__(self):
        """Konstruktor von OderSoZaehler"""
        Zaehler.__init__(self)

    def Zaehle(self, wieviel=10):
        """Veraendernde Methode fuer den Stand.
        Diese Methode ueberschreibt Zaehle() von Zaehler,
        verwendet aber diese Methode."""
        for i in range(wieviel):
            super(OderSoZaehler, self).Zaehle()
 

und den Ausgaben

0
1

0
10
15

0
10
15
 

Die beiden verschiedenen Methoden zur Ausgabe in der folgenden "Lösung" zeigen, dass zwei verschiedene Variablen angelegt wurden und die in der erbenden Klasse die aus der vererbenden Klasse überdeckt, was hier sicherlich nicht beabsichtigt war.

class Zaehler(object):
    '''Erben von object notwendig wegen super'''

    def __init__(self):
        """Konstruktor von Zaehler
        initialisiert die Instanzvariable __stand von Zaehler"""
        self.__stand = 0

    def GibStand(self):
        """Get-Methode fuer den Stand"""
        return self.__stand

    def Zaehle(self):
        """Veraendernde Methode fuer den Stand.
        Diese Methode wird von der erbenden Klasse ueberschrieben."""
        self.__stand += 1

 

class ZehnZaehler(Zaehler):

    def __init__(self):
        """Konstruktor von ZehnZaehler
        initialisiert die Instanzvariable __stand von Zaehler"""
        Zaehler.__init__(self)
        self.__stand = 0

    def Zaehle(self):
        """Veraendernde Methode fuer den Stand.
        Diese Methode ueberschreibt Zaehle() von Zaehler."""
        self.__stand += 10

    def ZaehleSuper(self):
        """Veraendernde Methode fuer den Stand.
        Diese Methode Diese Methode ruft Zaehle() von Zaehler auf,
        ein direkter Zugriff aus ZehnZaehler ist unmoeglich."""
        super(ZehnZaehler, self).Zaehle()

    def GibStandInZehnZaehler(self):
        """Get-Methode fuer den Stand"""
        return self.__stand

Ausgabe


0
0

0
10

0
20

1
20

1
30

2
30
 

<== Zur Übersicht der Begriffe ==>

© Claus Albowski