Python_Essentials_21 - itnett/FTD02H-N GitHub Wiki

🐍 Objektorientert Programmering i Python (OOP)

Velkommen til den neste fasen av Python-opplæringen! Objektorientert programmering (OOP) er en sentral del av moderne programmering. I denne delen skal vi lære hvordan OOP fungerer i Python. Vi vil dekke konsepter som klasser, objekter, arv, og polymorfisme.


📚 Hva er Objektorientert Programmering?

Objektorientert programmering er en programmeringsmodell som er basert på konseptet av objekter. Objekter kan representere virkelige eller abstrakte ting. Hvert objekt har:

  • Egenskaper (state/attributter), og
  • Metoder (oppførsel/funksjoner).

Eksempel på objekter i virkeligheten:

  • En bil kan være et objekt. Den har egenskaper som modell, farge, hastighet, og metoder som å akselerere, bremse.
  • En hund kan også være et objekt. Den har egenskaper som rase, alder, navn, og metoder som å bjeffe, spise, løpe.

🔧 Klasser og Objekter i Python

I Python starter OOP med å definere klasser. En klasse er en mal eller "blueprint" for å lage objekter. Når du lager et objekt, kalles dette å instansiere en klasse.

Definere en Klasse 📦

La oss definere en enkel klasse i Python:

class Hund:
    def __init__(self, navn, alder):
        self.navn = navn
        self.alder = alder

    def bjeff(self):
        print(f"{self.navn} sier voff!")

💡 Her har vi definert en klasse Hund med to egenskaper: navn og alder, og én metode bjeff.

Lage et Objekt 🐕

Nå kan vi bruke denne klassen til å lage et objekt (en faktisk hund!):

min_hund = Hund("Luna", 3)
min_hund.bjeff()  # Output: Luna sier voff!

💡 Viktige Begreper:

  • __init__-metoden: Dette er en spesiell metode som kalles en konstruktør. Den brukes til å initialisere (gi verdier til) objektets egenskaper når objektet opprettes.
  • self: Dette refererer til det nåværende objektet. Det brukes for å få tilgang til objektets variabler og metoder.

🛠️ Arv i Python (Inheritance)

Arv gjør det mulig å lage en ny klasse basert på en eksisterende klasse. Den nye klassen (underklassen) arver alle egenskapene og metodene fra den eksisterende klassen (overklassen).

Eksempel på Arv:

class Dyr:
    def __init__(self, navn):
        self.navn = navn

    def lag_lyd(self):
        print("Dyr lager lyd.")

# Hund arver fra Dyr
class Hund(Dyr):
    def lag_lyd(self):
        print(f"{self.navn} sier voff!")

min_hund = Hund("Luna")
min_hund.lag_lyd()  # Output: Luna sier voff!
  • Arv tillater oss å gjenbruke kode, og vi kan også overstyre (override) metoder i underklassen, som vi ser med lag_lyd().

🎨 Polymorfisme

Polymorfisme lar objekter fra ulike klasser bruke samme metode på forskjellige måter. I eksempelet under har både Hund og Katt en metode lag_lyd, men de gir forskjellige resultater.

Eksempel på Polymorfisme:

class Katt(Dyr):
    def lag_lyd(self):
        print(f"{self.navn} sier mjau!")

min_hund = Hund("Luna")
min_katt = Katt("Milo")

for dyr in (min_hund, min_katt):
    dyr.lag_lyd()

# Output:
# Luna sier voff!
# Milo sier mjau!

Her ser vi at både Hund og Katt har sin egen implementasjon av lag_lyd selv om de begge arver fra Dyr.


🧰 Enkapsulering

Enkapsulering betyr at data (egenskaper) og metoder pakkes sammen i én enhet, som gjør det mulig å beskytte og kontrollere tilgangen til dataene.

Private Egenskaper 👮‍♂️

I Python kan vi gjøre en egenskap privat ved å bruke dobbelt underscore (__).

💡 Eksempel:

class BankKonto:
    def __init__(self, saldo):
        self.__saldo = saldo  # Privat egenskap

    def sett_inn(self, beløp):
        self.__saldo += beløp

    def vis_saldo(self):
        return self.__saldo

konto = BankKonto(1000)
konto.sett_inn(500)
print(konto.vis_saldo())  # Output: 1500
  • Her er __saldo en privat variabel som ikke kan nås direkte utenfor klassen, men den kan endres gjennom metodene sett_inn og vis_saldo.

👨‍🏫 Oppgaver

1. Opprett en Bil-klasse:

Lag en klasse Bil med egenskaper som merke, modell, og farge. Legg til metoder som start_motor og stopp_motor.

💡 Eksempel:

class Bil:
    def __init__(self, merke, modell, farge):
        self.merke = merke
        self.modell = modell
        self.farge = farge

    def start_motor(self):
        print(f"{self.merke} motoren er startet!")

    def stopp_motor(self):
        print(f"{self.merke} motoren er stoppet!")

min_bil = Bil("Toyota", "Corolla", "rød")
min_bil.start_motor()  # Output: Toyota motoren er startet!
min_bil.stopp_motor()  # Output: Toyota motoren er stoppet!

2. Bruk Arv:

Lag en underklasse ElBil som arver fra Bil og har en ekstra metode som heter lad_batteri.

3. Polymorfisme:

Lag flere dyreklasser som Katt, Fugl og Ku, alle med en metode lag_lyd som gir ulike utdata.


🎯 Oppsummering

  • Klasser og objekter lar deg strukturere koden i logiske enheter.
  • Arv gjenbruker og utvider eksisterende klasser, noe som gir kodegjenbruk og fleksibilitet.
  • Polymorfisme tillater bruk av samme metode på forskjellige klasser, noe som forenkler koden.
  • Enkapsulering beskytter data og kontrollerer tilgang til dem gjennom metoder.

🔗 Forrige side: Dekoratører, Iteratorer og Regex | Neste side: Feilhåndtering i Python →


Lykke til med Python-koding! Fortsett å utforske OOP for å lage kraftige og velstrukturerte applikasjoner! 🐍✨