Arv tillader en klasse (underklasse eller barn) at genbruge og udvide felterne og metoderne fra en anden klasse (superklasse eller forælder). Den modellerer et is-a-forhold: en Dog er en Animal.
Arv tillader en klasse (underklasse eller barn) at genbruge og udvide felterne og metoderne fra en anden klasse (superklasse eller forælder). Den modellerer et is-a-forhold: en Dog er en Animal.
class 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 fik __init__ og eat uden bekoste og tilføjede bark. En underklasse kan også tilsidesætte nedarvede metoder for at ændre adfærd.
| Fordel | Risiko |
|---|---|
| Genbrug af delt kode | Stram koblingen til forælderen |
| Modellering af virkelige hierarkier | Skør basisklasse — forældrændringer bryder børn |
| Polymorfisme via en fælles type | Dybe træer bliver svære at følge |
En almindelig retningslinje: foretrække komposition frem for arv, når forholdet virkelig er "has-a", ikke "is-a".
Arv er den mest misbrugte OOP-funktion: det er fristende at bruge den bare for at dele kode, hvilket forbinder ikke-relaterede klasser.
Used korrekt — kun til ægte is-a-forhold — giver det dig genbrug plus polymorfisme, så du kan behandle mange undertyper ensartet gennem deres fælles forælder.