ermöglicht es einer Klasse ( oder ), die Felder und Methoden einer anderen Klasse ( oder ) wiederzuverwenden und zu erweitern. Sie modelliert eine -Beziehung: ein .
ermöglicht es einer Klasse ( oder ), die Felder und Methoden einer anderen Klasse ( oder ) wiederzuverwenden und zu erweitern. Sie modelliert eine -Beziehung: ein .
DogAnimalclass Animal:
def __init__(self, name):
self.name = name
def eat(self):
return f"{self.name} is eating"
class Dog(Animal): # Dog inherits everything from Animal
def bark(self): # ...and adds new behavior
return "Woof!"
d = Dog("Rex")
print(d.eat()) # "Rex is eating" → inherited, not rewritten
print(d.bark()) # "Woof!" → Dog-specific
Dog erhielt __init__ und eat kostenlos und fügte bark hinzu. Eine Unterklasse kann geerbte Methoden auch überschreiben, um das Verhalten zu ändern.
| Vorteil | Risiko |
|---|---|
| Gemeinsamen Code wiederverwenden | Enge Kopplung an die Elternklasse |
| Reale Hierarchien modellieren | Fragile Basisklasse — Änderungen der Eltern brechen untergeordnete Klassen |
| Polymorphismus über einen gemeinsamen Typ | Tiefe Bäume werden schwer zu verfolgen |
Eine häufige Richtlinie: Komposition gegenüber Vererbung bevorzugen, wenn die Beziehung wirklich "has-a" ist, nicht "is-a".
Vererbung ist die am meisten missbrauchte OOP-Funktion: Es ist verlockend, sie nur zum Teilen von Code zu verwenden, was nicht verwandte Klassen koppelt.
Richtig verwendet — nur für echte is-a-Beziehungen — bietet es dir Wiederverwendung plus Polymorphismus, mit dem du viele Untertypen einheitlich durch ihre gemeinsame Elternklasse behandeln kannst.