Du har en samling med variabler som hører sammen. Et bilmerke, en modell, et byggeår. Du sender dem rundt som tre separate parametere til funksjoner, og hver gang du legger til en ny bil, kopierer du den samme strukturen. Klasser i Python løser akkurat dette problemet. De lar deg samle data og funksjonalitet i en gjenbrukbar enhet.
Hva er en klasse i Python?
En klasse er en mal for å lage objekter. Tenk på den som en oppskrift: klassen beskriver hvilke egenskaper og metoder et objekt skal ha, mens objektet er det ferdige resultatet. Du kan lage så mange objekter du vil fra samme klasse, og hvert objekt lever sitt eget liv med sine egne verdier.
For å definere en klasse bruker du nøkkelordet class etterfulgt av et navn og kolon:
- class Car: definerer en klasse som heter Car.
- Klassenavn skrives med stor forbokstav (PascalCase). Det er konvensjonen i Python.
- I eldre Python-kode ser du ofte class Car(object):, men fra Python 3 er det unødvendig. Klasser arver fra object automatisk.
__init__ og self forklart
En tom klasse gjør lite nytte. For at klassen skal lagre data, trenger du en konstruktør. I Python heter den __init__ (dobbel understrek, init, dobbel understrek). Denne metoden kjøres automatisk hver gang du lager et nytt objekt fra klassen.
Inne i __init__ dukker self opp som første parameter. self er en referanse til det spesifikke objektet du jobber med. Når du skriver self.brand = brand, sier du at dette objektet skal ha en egenskap som heter brand, og den skal få verdien du sender inn.
- def __init__(self, brand, model, year): tar inn tre parametere i tillegg til self.
- self.brand = brand lagrer merket som en egenskap på objektet.
- self.model = model lagrer modellen.
- self.year = year lagrer byggeåret.
Navnene på venstre side av likhetstegnet (self.brand) trenger ikke være like parameternavnene (brand), men det er god konvensjon å holde dem like. Det gjør koden lettere å lese.
Lag objekter fra klassen
Når klassen er definert, lager du objekter ved å kalle klassenavnet som om det var en funksjon:
- volvo = Car("Volvo", "S90", 2021)
- audi = Car("Audi", "R8", 2019)
Hvert objekt har sine egne verdier. volvo.model gir "S90", mens audi.model gir "R8". Endrer du modellen på Volvo-objektet med volvo.model = "S80", påvirker det ikke Audi-objektet. De er helt uavhengige av hverandre.
Du kan bruke egenskapene akkurat som vanlige variabler. Sammenligning fungerer som forventet: volvo.year > audi.year returnerer True fordi 2021 er større enn 2019.
Legg til metoder i klassen
Klasser handler ikke bare om data. Du kan legge til metoder som opererer på objektets egenskaper. En metode er en funksjon som tilhører klassen og alltid tar self som første parameter:
- def describe(self): definerer en metode uten ekstra parametere.
- Inne i metoden bruker du self.brand, self.model og self.year for å hente objektets verdier.
- Du kaller metoden med volvo.describe(). Python sender automatisk objektet som self.
Fordelen med metoder er at logikken bor sammen med dataen. I stedet for å skrive en frittstående funksjon som tar en bil som parameter, lar du bilen beskrive seg selv. Det gjør koden mer organisert, spesielt når programmet vokser.
Klasseegenskaper vs. instansegenskaper
Egenskapene du setter i __init__ med self er instansegenskaper. Hvert objekt har sin egen kopi. Men du kan også definere egenskaper direkte i klassen, utenfor __init__. Disse kalles klasseegenskaper og deles mellom alle objekter.
Et typisk eksempel er konstanter. Alle biler har fire hjul, så det gir mening å definere wheels = 4 rett under class-linjen i stedet for i __init__. Både volvo.wheels og audi.wheels returnerer 4 uten at du trenger å sende det inn som parameter.
Forskjellen er viktig å forstå: endrer du en klasseegenskap, påvirker det alle objekter. Endrer du en instansegenskap, påvirker det bare det ene objektet.
En fil per klasse, eller flere i samme?
Python tvinger deg ikke til å ha en klasse per fil. Du kan ha flere klasser i samme .py-fil. Men for større prosjekter er det ryddig å gi hver klasse sin egen fil. car.py inneholder Car-klassen, person.py inneholder Person-klassen. Det gjør det lettere å finne frem når prosjektet vokser.
For små hjelpeklasser som kun brukes av en hovedklasse, er det helt greit å samle dem i samme fil. Bruk sunn fornuft. Målet er at noen som åpner filen, raskt forstår hva den inneholder.
Vanlige feil når du lager klasser i Python
Den vanligste feilen er å glemme self som første parameter i metoder. Gjør du det, får du en TypeError når du prøver å kalle metoden. Python sender alltid objektet som første argument, og uten self har metoden ingen plass å ta imot det.
En annen klassiker er å skrive brand = brand i stedet for self.brand = brand i __init__. Uten self lagrer du bare en lokal variabel som forsvinner når __init__ er ferdig. Egenskapen blir aldri satt på objektet, og du får en AttributeError senere.
Neste steg
Nå som du kan lage klasser i Python, er neste steg å kontrollere tilgangen til egenskapene. Artikkelen om property i Python viser deg hvordan du bruker @property for å legge til validering og innkapsling. Vil du at klassene dine skal gi nyttig informasjon når du printer dem, forklarer artikkelen om __repr__ og __str__ hvordan du tilpasser utskriften. Pythons offisielle dokumentasjon om klasser gir en grundig gjennomgang av alle detaljene.
Denne artikkelen bygger på kurset Python – objektorientert programmering på Utdannet.no. I kurset lager du klasser fra bunnen av, jobber med egenskaper, metoder og arv, og får oppgaver med løsningsforslag som hjelper deg å bygge forståelsen steg for steg.




