Arv av klasser er et grunnleggende konsept i objektorientert programmering (OOP) som lar oss lage nye klasser basert på eksisterende klasser.
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"
