Statiske metoder og klassemetoder i Python forklart

Lær forskjellen mellom statiske metoder, klassemetoder og instansmetoder i Python. @staticmethod og @classmethod.

Videoforhåndsvisning

Opprett konto for å se video

Det er helt gratis og tar under 30 sekunder

Opprett gratis kontoHar du konto? Logg inn

Du har en Person-klasse og vil lage en metode som sammenligner alderen til to personer. Metoden trenger ikke tilgang til noen bestemt person, bare de to som sendes inn. Skal den da bruke self? Og hva med en metode som lager et objekt fra en tekststreng i stedet for vanlige parametere? Python har tre typer metoder for ulike situasjoner: instansmetoder, klassemetoder og statiske metoder.

Instansmetoder bruker self

Instansmetoder er de vanlige metodene du allerede kjenner. De tar self som første parameter og har full tilgang til objektets egenskaper og andre metoder. Hver gang du skriver def describe(self): inne i en klasse, lager du en instansmetode.

Du kaller instansmetoder på et objekt: volvo.describe(). Python sender automatisk objektet som self, slik at metoden vet hvilke verdier den jobber med. De fleste metoder i en klasse er instansmetoder. Det er standardvalget, og du trenger ingen dekoratør for å bruke dem.

Statiske metoder i Python med @staticmethod

En statisk metode tilhører klassen, men har ingen tilgang til verken objektet (self) eller klassen (cls). Den tar bare de parameterne du sender inn eksplisitt. Du markerer den med @staticmethod over funksjonsdefinisjonen.

Et godt eksempel er en metode som sammenligner to Person-objekter for å finne den eldste:

  • @staticmethod
  • def who_is_oldest(person1, person2):
  • Metoden sammenligner person1.age og person2.age og returnerer den eldste.

Du kan kalle en statisk metode direkte på klassen: Person.who_is_oldest(magnus, sara). Du trenger ikke lage et objekt først. Du kan også kalle den på et objekt (magnus.who_is_oldest(magnus, sara)), men det gir ingen ekstra funksjonalitet. Klassen er bare en praktisk plassering for metoden.

Statiske metoder er nyttige for hjelpefunksjoner som logisk hører til klassen, men som ikke trenger tilgang til noen bestemt instans. De holder relatert kode samlet i stedet for å ha frittstående funksjoner spredt rundt i prosjektet.

Klassemetoder i Python med @classmethod

En klassemetode tar cls som første parameter i stedet for self. cls refererer til selve klassen, ikke et bestemt objekt. Du markerer den med @classmethod.

Den vanligste bruken av klassemetoder er som factory methods, altså alternative måter å opprette objekter på:

  • @classmethod
  • def from_string(cls, data_string):
  • Metoden parser strengen og kaller cls(name, age, height, weight) for å lage et nytt objekt.

Fordelen med cls fremfor å hardkode klassenavnet er at metoden fungerer riktig også for subklasser. Arver du fra Person og kaller Student.from_string("Kari,22,170,65"), lager cls et Student-objekt, ikke et Person-objekt. Med et hardkodet klassenavn ville du alltid fått en Person tilbake.

Når bruker du hvilken type?

Valget mellom de tre typene er enklere enn det virker. Still deg selv ett spørsmål: trenger metoden tilgang til et objekt, til klassen, eller ingen av delene?

  • Instansmetode (self): Metoden leser eller endrer data på et bestemt objekt. Bruk dette som standard.
  • Klassemetode (cls): Metoden trenger å referere til klassen selv, typisk for å opprette nye objekter. Bruk dette for factory methods.
  • Statisk metode: Metoden trenger verken objektet eller klassen. Den utfører en beregning eller sammenligning basert kun på parameterne. Bruk dette for hjelpefunksjoner som logisk tilhører klassen.

En tommelfingerregel: start med instansmetoder. Oppdager du at metoden aldri bruker self, vurder om den bør være statisk. Trenger du å lage objekter på alternative måter, bruk en klassemetode.

Strukturer koden med statiske metoder

Statiske metoder i Python er spesielt nyttige for å organisere sammenlignings- og valideringslogikk. I stedet for å spre hjelpefunksjoner utover i kodebasen, samler du dem i klassen de hører til.

En PersonComparator-klasse kan for eksempel ha flere statiske metoder: who_is_oldest, who_is_tallest, who_is_heaviest. Ingen av dem trenger et eget objekt. De tar inn to Person-objekter og returnerer et resultat. Klassen fungerer som en organisatorisk enhet, ikke som en mal for å lage objekter.

Det er et mønster du ser i mange Python-prosjekter: klasser som samler relaterte statiske metoder fungerer som navnerom. De gjør det lettere å finne relevant funksjonalitet uten å lete gjennom frittstående funksjoner.

Vanlige feil med metoder i Python

Den hyppigste feilen er å glemme @staticmethod på en metode som ikke tar self. Uten dekoratøren forventer Python at første parameter er self, og du får en TypeError når du kaller metoden med feil antall argumenter.

En annen vanlig feil er å bruke en statisk metode når du burde brukt en klassemetode. Skriver du klassenavnet direkte i en statisk metode (for eksempel Person(name, age)) i stedet for å bruke cls, bryter du arv. Subklasser vil alltid opprette Person-objekter i stedet for seg selv.

Pass også på rekkefølgen. Definer instansegenskapene i __init__ først, deretter instansmetoder, klassemetoder, og til slutt statiske metoder. Det er ikke et krav fra Python, men en konvensjon som gjør klassen lettere å navigere.

Neste steg

Med de tre metodetypene på plass, er det naturlig å lære hvordan klasser kan bygge på hverandre. Artikkelen om arv i Python viser deg hvordan subklasser arver og overstyrer metoder fra foreldreklassen. Vil du gjøre klassene dine mer informative når du printer dem, forklarer artikkelen om __repr__ og __str__ hvordan du kontrollerer utskriften. Pythons offisielle dokumentasjon for classmethod gir en komplett oversikt over detaljene.

Denne artikkelen bygger på kurset Python – objektorientert programmering på Utdannet.no. I kurset jobber du med instansmetoder, klassemetoder og statiske metoder gjennom praktiske øvelser, og du får oppgaver der du bygger klasser med factory methods og sammenligningslogikk.