Direct naar de hoofdinhoud
Module 7 · Les 2 van 426/36 in de cursus~12 min
Modulelessen (2/4)

Erfenis

Met Overerving kunt u een nieuwe klasse (de subklasse) maken erft attributen en methoden van een bestaande klasse (de basisklasse), en kan deze uitbreiden of overschrijven.

Basissyntaxis

Python
class Animale:
    def __init__(self, nome):
        self.nome = nome

    def saluta(self):
        return f"{self.nome} fa un verso"

class Cane(Animale):       # Cane EREDITA da Animale
    def saluta(self):       # OVERRIDE del metodo
        return f"{self.nome} dice WOOF!"

a = Animale("X")
c = Cane("Fido")
a.saluta()      # 'X fa un verso'
c.saluta()      # 'Fido dice WOOF!'

Cane erft __init__ van Animale zonder het te herschrijven.

super(): de basismethode aanroepen

Wanneer u een basismethode wilt uitbreiden (niet volledig vervangen), gebruikt u super():

Python
class Animale:
    def __init__(self, nome):
        self.nome = nome

class Cane(Animale):
    def __init__(self, nome, razza):
        super().__init__(nome)    # delega alla base
        self.razza = razza

c = Cane("Fido", "Labrador")
c.nome        # 'Fido'
c.razza       # 'Labrador'

isinstance: typecontrole

Python
isinstance(c, Cane)        # True
isinstance(c, Animale)     # True (anche la base)
isinstance(c, str)         # False

isinstance(x, BaseClass) herkent ook alle subklassen: dit is wat maakt overerving nuttig voor polymorfisme.

Python
animali = [Cane("Fido", "X"), Animale("Pippo")]
for a in animali:
    print(a.saluta())        # ogni oggetto risponde a suo modo

MRO (Method Resolution Order) – overzicht

Als je meerdere overervingen hebt, beslist Python in welke volgorde er gekeken moet worden voor een methode door de MRO te volgen, berekend met het C3-algoritme. Voor In 95% van de gevallen is het voldoende om te weten:

  1. het ziet er eerst uit in de instantie,
  2. dan in zijn klasse,
  3. vervolgens in de basisklassen in declaratievolgorde.
Python
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)

object is de root van elke klasse in Python 3.

Jouw beurt

Oefening#python.m7.l2.e1
Pogingen: 0Laden…

Gegeven `klasse voertuig: def __init__(self, brand): self.brand = brand`, definieer `Car(Voertuig)` met __init__(self, brand, model) dat super().__init__ aanroept en self.model opslaat. Creëer `a = Car('Fiat', '500')` en evalueer `(a.brand, a.model)`.

Editor laden…
Toon hint

super().__init__(brand) en dan self.model = model.

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#python.m7.l2.e2
Pogingen: 0Laden…

Definieer `class Shape: def area(self): return 0` en `class Square(Shape)` met __init__(self, side) en area() die side * side retourneert. Maak `q = Square(5)` en evalueer de tuple `(q.area(), isinstance(q, Shape))`.

Editor laden…
Toon hint

zelf.zijde * zelf.zijde.

Oplossing beschikbaar na 3 pogingen

Extra uitdaging

Oefening#python.m7.l2.e3
Pogingen: 0Laden…

Create a class `Square` that inherits from the `Rectangle` class (defined below). The constructor of `Square` must take a single parameter `side` and pass it to `super().__init__(side, side)`. Instantiate a square with side `6` in `sq` and evaluate `sq.area()`.

Editor laden…
Toon hint

Declare class Square(Rectangle): and call super().__init__(side, side) in the constructor.

Oplossing beschikbaar na 3 pogingen