Klasser och moduler
Det går utmärkt att ha flera klasser i en modul. Om du då vill komma åt dessa klasser från en annan modul importerar du modulen. Som för funktioner skriver du sedan modulnamn.Klassnamn när du vill använda klassen. Ex:import minmodul ... # Skapar objektet mittobjekt av klassen MinKlass från modulen minmodul mittobjekt = minmodul.MinKlass() ...
Övning 2.25
Kopiera klasserna för de geometrikska kropparna du skapat till en modul med namnet klossar (filnamnet är alltså klossar.py).
Arv eller klasser och underklasser
En av poängerna med objektorienterad programmering är arv av egenskaper mellan klasser. Vi kan skapa en huvudklass med de variabler och metoder som objekt i underklasser skall ha gemensamt.Vi vill att alla klossar skall ha en position och en färg. Positionen skall vara en lista med tre element [x, y, z] och färgen en textsträng. Vi vill kunna ändra färg och också ha möjlighet att flytta klossarna genom att ange en ny position.
Huvudklassen blir då:
#Huvudklass Klossar class Kloss : def __init__(self): self.position =[0, 0, 0] self.farg="" def flytta(self,position): self.position=position def satt_farg(self, farg): self.farg=farg
Nu har vi grunden för metoder och variabler som kan ärvas av alla varianter av klossar vi skapar. Metoderna i underklasserna går före de i huvudklassen så då det finns en metod volym() i klassen Kub så körs den om objektet är en kub. Skulle det inte finnas en metod i underklassen så körs istället den i huvudklassen.Så om man kallar på metoden flytta för en kub så körs metoden i huvudklassen Klossar.
För att göra det lite snyggt så inför vi tomma metoder i huvudklassen för de som ska implementeras i alla underklasser, alltså volym, area och skala. Genom detta är det lätt att se vad en underklass förväntas implementera. Tomma metoder skapas genom att lägga in pass som enda del i metodkroppen. Metoden skala(k) i huvudklassen Klossar ser alltså ut så här:
def skala(self, k): passÖvning 2.26
Lägg till tomma klasser för skala, volym och area i huvudklassen
Att skapa arvet
Nu måste vi få underklasserna att ärva metoder och variabler från huvudklassen.För att tala om att en klass är en underklass till en annan anges huvudklassen i parentes bakom namnet på underklassen. I vårt fall ändrar vi i raden där vi definierar Kub till:
class Kub(Kloss) :
Nu är Kub en underklass till Klossar och har tillgång till dess metoder.För att Kub skall få samma variabler som huvudklassen ser vi till att huvudklassens initiering körs samtidigt som underklassens. Detta sker med hjälp av funktionen super(). super(). refererar till huvudklassen ungefär som self refererar till klassen själv.
Klassen Kub får med arv och initiering av variablerna i Klossar utseendet:
class Kub(Kloss) : def __init__(self, sida): super().__init__() self.sida=sida def skala(self, k): self.sida=self.sida*k def volym(self): return self.sida*self.sida*self.sida def area(self): return self.sida*self.sida*6
Övning 2.27
Skriv om övriga kloss-klasser så att de ärver metoder och variablerna från Klossar.
Övning 2.28
Skapa en ny modul, klosstest, och pröva att arvet fungerar:
Skriv och kör:
import klossar kuben=klossar.Kub(8) print(kuben.position) kuben.flytta([1,2,3]) print(kuben.position) kuben.skala(2) print(kuben.volym())
Övning 2.29
Skriv tester för några av de andra kloss-typerna samt färgen också.