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 
__saldoen privat variabel som ikke kan nås direkte utenfor klassen, men den kan endres gjennom metodenesett_innogvis_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! 🐍✨