Clone
10
Python Object Oriented Programming
Lerking edited this page 2025-03-20 21:05:38 +01:00

Python Object Oriented Programming - OOP

Vi vil nu se på, hvordan python arbejder med objekter (klasser).
En klasse, er en samling af variabler samt funktioner, som er tilknyttet den pågælende klasse.
I python, kaldes variabler også for attributter. Hvorimod en funktion hedder en funktion, når den ligger undenfor en klasse, men en metode (method), når den er en del af en klasse.

Class

Hvis en klasse skal oprettes med værdier, skal disse indgå i klasse definitionen.
Dette gøres med en speciel metode __init__(self):
Denne methode køres, med de parametre der nu er defineret, til at indgå i oprettelsen af et objekt af klassen.
Opret en ny fil.

class Firkant:
    def __init__(self, lg: int, br: int):
        self.laengde = lg
        self.bredde = br

Vi starter med at definere en klasse, ved navn firkant. Denne klasse får en inititialiceringsmetode, som indeholde den specielle variabel self, samt de parametre som skal bruges til at oprette objektet.
I dette tilfælde, lg og br, begge af typen int - Dette kaldes type hinting.
I __init__(self, lg: int, br: int) metoden, opretter vi 2 variabler (self.laengde og self.bredde), som tildeles værdierne fra lg og br.

Nu laver vi en ny metode, til udregning af arealet for en firkant.

class Firkant:
    def __init__(self, lg: int, br: int):
        self.laengde = lg
        self.bredde = br
    
    def areal(self) -> int:
        return self.laengde * self.bredde
class Firkant:
    def __init__(self, lg: int, br: int):
        self.laengde = lg
        self.bredde = br
    
    def areal(self) -> int:
        return self.laengde * self.bredde
    
min_firkant = Firkant(10, 10)
print("Arealet er:", min_firkant.areal())

Gem filen som firkant.py Kør skriptet.

> python firkant.py
  Arealet er: 100
>

Inheritance (nedarving)

Python klasser kan arve hinandens funktionalitet - d.v.s. at den nye klasse får forældreklassens variabler og metoder. Vi vi nu lave en klasse - kube som arver fra firkant. På samme tid vil vi begynde at se på import, og vigtigheden af at kontrollere hvornår python udfører kode. Vi starter med en ny fil - kube.py

import firkant # Vi importerer firkant.py filen

class Kube(firkant.Firkant): # Vi opretter en ny klasse - **Kube**, som arver **Firkant**'s funktionalitet, fra filen *firkant.py*.
	def __init__(self, lg:int, br:int, ho: int):
		super().__init__(lg, br) # Vi initialiserer **Firkant**, med værierne *lg* og *br*. Dette gøres med den specielle funktion **super()**, som refererer til den arvede klasse.
		self.hojde = ho
    
	def rumfang(self) -> int:
		return self.laengde * self.bredde * self.hojde

min_kube = Kube(10, 10, 10) # De 3 værdier er **lg**, **br**, **ho** - Alle sat til 10.
print("Rumfang:", min_kube.rumfang())

Gem filen som kube.py Kør filen, og se hvad der sker.

> python kube.py
  Arealet er: 100
  Rumfang: 1000
>

Som vi kan se, virker skriptet sådan set udmærket, med undtagelse af, at arealet bliver udskrevet. Det har vi ikke bedt om! Dette bringer os til emnet import og kontrol af hvad der sker, når vi kører et skript. Python afvikler al kode, i en importeret fil, ligesom hvis den importerede fil var blevet kørt direkte. Dette giver problemer, da den der importerer en fil, ikke har kontrol over hvilken kode der bliver afviklet. Der findes flere måder at klare dette på. Den vigtigste er, at sikre, at kun hvis en fil køres direkte f.eks.

> python firkant.py
  Arealet er: 100
>

Dette gøres ved at introducere en specifik program struktur.

if __name__ == "__main__":

Dette medfører, at man sikrer, at kun hvis programmet køres direkte, eksekveres den efterfølgende kode. Grundreglen er, at kun definitioner (def(), class() samt variable må laves herover. Al kode, som vil blive udført direkte, skal ligge i den blok. Vi gør dette ved, at ændre "firkant.py" således.

class Firkant:
    def __init__(self, lg: int, br: int):
        self.laengde = lg
        self.bredde = br
    
    def areal(self) -> int:
        return self.laengde * self.bredde

print("Værdien af '__name__' er:", __name__) # Vi udskriver her, hvad værdien af "__name__" er.

if __name__ == "__main__":
    min_firkant = Firkant(10, 10)
    print("Arealet er:", min_firkant.areal())

Når vi kører firkant.py direkte, får vi dette.

> python firkant.py
  Værdien af '__name__' er:" __main__
  Arealet er: 100
>

Som vi kan se, køres koden, i "if name" blokken. Hvis vi så kører kube.py istedet.

> python kube.py
  Værdien af '__name__' er: firkant
  Rumfang: 1000
>

Som vi nu kan se, har værdien af '__name__' ændret sig, når filen bliver importeret. Vi vil nu ændre kube.py, på samme måde. Samtidig tilføjer vi udskrivning af 'Areal', for at vise at Kube har arvet metoden areal() fra Firkant.

import firkant # Vi importerer firkant.py filen

class Kube(firkant.Firkant): # Vi opretter en ny klasse - **Kube**, som arver **Firkant**'s funktionalitet, fra filen *firkant.py*.
	def __init__(self, lg:int, br:int, ho: int):
		super().__init__(lg, br) # Vi initialiserer **Firkant**, med værierne *lg* og *br*. Dette gøres med den specielle funktion **super()**, som refererer til den arvede klasse.
		self.hojde = ho
    
	def rumfang(self) -> int:
		return self.laengde * self.bredde * self.hojde

if __name__ == "__main__":
	min_kube = Kube(10, 10, 10) # De 3 værdier er **lg**, **br**, **ho** - Alle sat til 10.
	print("Rumfang:", min_kube.rumfang())
	print("Grundareal:", min_kube.areal())

Ligeledes vil vi udkommentere udskrivning af '__name__' værdien, i firkant.py.

class Firkant:
    def __init__(self, lg: int, br: int):
        self.laengde = lg
        self.bredde = br
    
    def areal(self) -> int:
        return self.laengde * self.bredde

# print("Værdien af '__name__' er:", __name__) # Vi udskriver her, hvad værdien af "__name__" er.

if __name__ == "__main__":
    min_firkant = Firkant(10, 10)
    print("Arealet er:", min_firkant.areal())

Når vi nu kører kube.py, får vi følgende.

> python kube.py
  Rumfang: 1000
  Grundareal: 100
>

En sidste ting, vi kan gøre nemmere at læse, er at rette vores import. I stedet for at importere filen, ønsker vi kun at importere klassen Firkant. Vi retter kube.py.

from firkant import Firkant # Vi importerer klassen Firkant, fra firkant.py filen

class Kube(Firkant): # Vi opretter en ny klasse - **Kube**, som arver **Firkant**'s funktionalitet.
	def __init__(self, lg:int, br:int, ho: int):
		super().__init__(lg, br) # Vi initialiserer **Firkant**, med værierne *lg* og *br*. Dette gøres med den specielle funktion **super()**, som refererer til den arvede klasse.
		self.hojde = ho
    
	def rumfang(self) -> int:
		return self.laengde * self.bredde * self.hojde

if __name__ == "__main__":
	min_kube = Kube(10, 10, 10) # De 3 værdier er **lg**, **br**, **ho** - Alle sat til 10.
	print("Rumfang:", min_kube.rumfang())
	print("Grundareal:", min_kube.areal())

Vi har nu lært lidt om klasser og nedarving😃