In Python sind Methoden nur Schlüssel-Wert-Paare im Wörterbuch, das an die Klasse angehängt ist. Wenn Sie eine Klasse von einer Basisklasse ableiten, sagen Sie im Wesentlichen, dass der Methodenname im ersten abgeleiteten Klassenwörterbuch und dann im Basisklassenwörterbuch angezeigt wird. Um eine Methode zu "überschreiben", deklarieren Sie die Methode einfach erneut in der abgeleiteten Klasse.
Was ist, wenn Sie die Signatur der überschriebenen Methode in der abgeleiteten Klasse ändern? Alles funktioniert ordnungsgemäß, wenn sich der Aufruf auf der abgeleiteten Instanz befindet. Wenn Sie den Aufruf jedoch auf der Basisinstanz ausführen, wird eine Fehlermeldung angezeigt, da die Basisklasse für denselben Methodennamen eine andere Signatur verwendet.
Es gibt jedoch häufige Szenarien, in denen die abgeleitete Klassenmethode zusätzliche Parameter haben soll und der Methodenaufruf auch ohne Fehler auf der Basis funktionieren soll. Dies wird als "Liskov-Substitutionsprinzip" (oder LSP ) bezeichnet, das garantiert, dass Personen, die von der Basisinstanz zur abgeleiteten Instanz oder umgekehrt wechseln, ihren Code nicht überarbeiten müssen. Um dies in Python zu tun, müssen Sie Ihre Basisklasse mit der folgenden Technik entwerfen:
class Base:
def hello(self, name, *args, **kwargs):
print("Hello", name)
class Derived(Base):
def hello(self, name, age=None, *args, **kwargs):
super(Derived, self).hello(name, age, *args, **kwargs)
print('Your age is ', age)
b = Base()
d = Derived()
b.hello('Alice')
b.hello('Bob', age=24)
d.hello('Rick')
d.hello('John', age=30)
Oben wird gedruckt:
Hallo Alice
Hallo Bob
Hallo Rick
Dein Alter ist Keine
Hallo John
Ihr Alter ist 30
.
Spielen Sie mit diesem Code