Programmering nivå 2
Kap 3.5 – Arv och polymorfism
Bygg vidare på klasser och låt samma metodnamn ge olika beteenden.
Mål med lektionen
När du har arbetat klart med denna lektion ska du:
- Förstå vad arv innebär i objektorienterad programmering.
- Kunna skapa en klass som ärver från en annan klass.
- Förstå grunderna i polymorfism och hur metoder kan överskuggas, alltså override.
Så här lär du dig bäst
Titta på hur du kan bygga vidare på en redan existerande klass. Börja med ett enkelt exempel och
försök sedan skriva en egen basklass och subklass. Kör koden och se hur objekten beter sig beroende
på vilken klass de tillhör. Läs gärna vidare om super() när du vill fördjupa dig.
Centrala begrepp
- Arv: en klass, subklassen, kan ärva attribut och metoder från en annan klass.
- Superklass eller basklass: den ursprungliga klassen vars beteenden ärvs.
- Subklass: en ny klass som bygger vidare på en annan.
- Override: en metod i subklassen ersätter metoden i basklassen.
- Polymorfism: samma metodnamn kan användas på olika objekt och ge olika resultat.
Arv i Python
Python använder parenteser för att visa att en klass ärver från en annan:
class Animal:
def speak(self):
print("Djuret låter.")
class Dog(Animal):
def speak(self):
print("Hunden säger voff.")
Användning:
animal = Animal()
dog = Dog()
animal.speak() # Djuret låter.
dog.speak() # Hunden säger voff.
Här ärver Dog från Animal, men metoden speak() har skrivits om
i subklassen. Det kallas override.
Polymorfism i praktiken
animals = [Dog(), Animal()]
for animal in animals:
animal.speak()
Alla objekt kan hanteras med samma metodanrop, men svarar på olika sätt beroende på vilken klass de tillhör.
Flera subklasser med polymorfism
class Cat(Animal):
def speak(self):
print("Katten säger mjau.")
class Bird(Animal):
def speak(self):
print("Fågeln kvittrar.")
animals = [Dog(), Cat(), Bird()]
for animal in animals:
animal.speak()
Beräkningsexempel med olika former
class Shape:
def area(self):
return 0
class Rectangle(Shape):
def __init__(self, w, h):
self.w = w
self.h = h
def area(self):
return self.w * self.h
class Circle(Shape):
def __init__(self, r):
self.r = r
def area(self):
return 3.14 * self.r ** 2
shapes = [Rectangle(4, 5), Circle(3)]
for shape in shapes:
print("Area:", shape.area())
super(): utöka basklassens metod
class Person:
def __init__(self, name):
self.name = name
def introduce(self):
print(f"Jag heter {self.name}.")
class Student(Person):
def __init__(self, name, school):
super().__init__(name)
self.school = school
def introduce(self):
super().introduce()
print(f"Jag går på {self.school}.")
super() gör det möjligt att återanvända basklassens kod och sedan lägga till mer beteende i
subklassen.
Öva: använd arv
- Skapa en basklass
Vehiclemed metodendrive(). - Skapa två subklasser:
CarochBike, som överskuggardrive(). - Skapa en lista med både bilar och cyklar och låt dem köra i en loop.
- Lägg till en metod i en subklass som använder
super().
Sammanfattning
- Arv låter en klass återanvända kod från en annan.
- Subklasser kan ändra hur en metod fungerar.
- Polymorfism låter samma metodanrop bete sig olika beroende på objekt.
super()kan användas för att återanvända logik från basklassen.