Arv av klasser

Skip to content

Arv av klasser er et grunnleggende konsept i objektorientert programmering (OOP) som lar oss lage nye klasser basert på eksisterende klasser.

4 pillars of oop

Det lar deg lage en kopi av en eksisterende klasse, som du så kan modifisere eller utvide uten å endre den opprinnelige klassen. Den nye klassen kalles en “subklasse” eller “avledet klasse”, mens den opprinnelige klassen kalles en “superklasse” eller “baseklasse”. Vi har også noe som heter abstraction i classes, eller ABC (Abstract Base Class) som er et “skjelett” av en klasse uten ferdig implementasjon. Dette kan være nyttig når vi ønsker å definere en felles grensesnitt for flere subklasser. (Dvs. en oppskrift for hvordan subklasser skal se ut)

Det er lettere å forstå med et eksempel:

from abc import ABC, abstractmethod

# En abstrakt klasse
class Animal(ABC):  # Abstract Base Classes (ABC) er selv en arvet klasse fra ABC modulen (fedreklassen er i parenteser)
    def __init__(self, name: str):
        self.name = name

    @abstractmethod  # abstractmethod er brukt i ABC for å indikere at denne metoden MÅ implementeres i subklasser
    def make_sound(self) -> str:
        pass

    def sleep(self) -> str:
        return f"{self.name} is sleeping."
Merk

Man er ikke nødt til å bruke en abstrakt klasse for å kunne benytte seg av arv, man kan også arve fra vanlige eksisterende klasser.

Dette vil også fungere like bra, men vår IDE gir strengere autocomplete ved bruk av ABC:

class Animal:
    def __init__(self, name: str):
        self.name = name

    def make_sound(self) -> str:
        raise NotImplementedError("Not implemented in base class")

    def sleep(self) -> str:
        return f"{self.name} is sleeping."

“Animal” her er en abstraksjon, men vi kan ikke bruke ABC varianten av den som en vanlig klasse fordi den ikke har en ferdig implementasjon av make_sound metoden. Vi kan derimot lage subklasser som arver fra “Animal” og implementerer make_sound metoden:

class Dog(Animal):  # Arver fra Animal klassen
    def make_sound(self) -> str:
        return "Woof!"

class Cat(Animal):
    def make_sound(self) -> str:
        return "Meow!"

# Bruk av klassene
dog = Dog("Buddy")
cat = Cat("Whiskers")

animals = [dog, cat]

for animal in animals:
    print(f"{animal.name} says {animal.make_sound()}")
    print(animal.sleep())  # Arvet metode fra "Animal", ikke implementert i "Dog" eller "Cat"