NemProgrammering.dk logo

OOP klasser

Lær Python programmering » OOP klasser # 11
Inkluderet:
Livstidsadgang
27 videolektioner
7 timers undervisning
Stil spørgsmål
Kursusbevis

Information om denne video

Underviser: Simon Rotendahl   Video: 19:29   Lektion nr. 11 af 27

Min helt egen type!

Vi har snakket om typer, og nu skal vi til klasser. Det kan blive forvirrende, da klasser faktisk er typer, og typer er klasser, det er en længere og unødvendig forklaring, så tænk på klasser og typer som det samme. Vi bruger klasser i objektorienteret programmering (OOP). OOP er et paradigme, og et paradigme er en samling af kutymer. Tankegangen er at dele ens kode op i objekter, og essensen af programmet er interaktionen mellem objekterne. OOP bliver meget brugt i applikationsdesign, da der er mange knapper, sliders osv. som så er objekter, og vi kan kode den adfærd.

En klasse er, som sagt, en type. Strenge, er en klasse, integers er en klasse. Vi skal nu lære at lave vores egen. Du kan tænke på en klasse som byggetegningen til et objekt. Når du laver et objekt fra en klasse, kaldes det at du ‘instantiere’, det kommer fra at et objekt fra en klasse, kaldes en instans af klasse.

I næste video ser vi videre på OOP.

Spørgsmål og kommentarer

Kun medlemmer med adgang til dette kursus kan stille spørgsmål og kommentere. Bliv medlem her!

  • Martin O. siger:

    speak() må ikke stå inden i en print()-funktion.

    1. Simon R. siger:

      Hej Martin,

      Godt spottet, der var jeg for hurtig og for fokuseret på at få videon færdig. Det er jeg ked af jeg forklare lige her hvad problemet var, så det er klart for alle, og det giver forhåbentlig en bedre forståelse for funktioner også. Hvis man har spørgsmål så endelig sig til!

      Når man har en funktion, så har den typisk en return værdi, vi kunne f.eks lave funktionen
      def plusSigSelv(x):
      return x+x
      nu kunne vi så skrive
      nyVærdi = plusSigSelv(2)
      hvilket vil give at nyVærdi for tallet 4, da vi ender med at returnere 2+2. Så funktionen plusSigSelv har return typen Int, da den returnere et heltal (den kunne også have float hvis man gav den f.eks 2,5 som input)

      print derimod har ingen returtype, det giver ikke mening at sige x = print(“Simon”), da print jo printer noget tekst, den den gemmer ikke en værdi. Når noget ikke har en returtype, så giver den None tilbage hvis man prøver, så når jeg siger
      print(Fido.speak)
      så bliver Fido.speak jo til print(“I am not a dog”), så vi ender faktisk med print(print(“I am not a dog”)) og da den inderste print returnere None (efter den har skrevet “I am not a dog” ud på skærmen), så får vi print(None) hvilket så printer None.

      Man bør i stedet lave funktionen speak således
      def speak(self):
      if self.species == “Dog”
      return “Bark”
      else
      return “I am not a dog”
      man kan så printe Fido.speak().

      Mvh.
      Simon

  • Arne Emil H. siger:

    Hej Simon

    Jeg kan ikke genemskue hvad jeg gør forkert her. Jeg synes umiddelbart koden er akkurat ens med den du har skrevet- jeg er ikke gået videre da jeg ikke får lov til at køre koden som du gør på nuværende tidspunkt. Kan du gennemskue det?

    pastebin med koden og fejlmeddelelsen:
    https://pastebin.com/b7CH3q2c

    Bedste hilsner Arne Emil

    1. Simon R. siger:

      Hej Arne Emil,

      Det der går galt er i disse to linjer

      def __init__(self,art,race,gender):
      self.species = species

      Når vi kører linjen
      Fido = Animal(“dog”, “pug”, “female”)
      så bliver __init__ funktionen kørt, det er det første der sker når man laver en instans af en klasse. Vores init funktion tager 3 argumenter (udover self), dem kalder du ‘art’, ‘race’ og ‘gender’, altså i linjen
      def __init__(self,art,race,gender):
      Så siger du bagefter at variablen
      self.species = species
      men hvad er species på højreside af lighedstegnet? Det har vi ikke nogen steder, og det er fordi du har kaldt den ‘art’ i stedet, så hvis du i stedet skriver
      self.species = art
      så virker det.

      Jeg håber det giver mening ellers må du sige til, som jeg nævner i videoen så er OOP et lidt svært koncept at forstå da mange ting spiller ind, men det plejer at komme hen af vejen :)

      Mvh.
      Simon

      1. Arne Emil H. siger:

        Hej Simon
        Tusind tak for hjælpen igen, nogle gange kan man ikke se skoven for bare træer, men havde bare ikke lige fået ændret alle variabelnavnene fra “pseudo-koden” fra slidesne som jeg troede.

        Bedste hilsner

  • Thomas Bach J. siger:

    Hej

    Virkelig forløsende med oplysningen 2 stk. underscores i __init__, det tror jeg bestemt I med fordel kan nævne i vidoen for os, som ikke umiddelbart kommer fra programmeringsmiljøet :)

    Stadigvæk tak for god undervisning :)

    1. Simon R. siger:

      Tak for feedbacken, jeg prøver lige at se om vi kan få lavet en pop up eller noget i videoen :) og tak for de pæne ord :)

  • Dorte G. siger:

    Hej,
    Jeg får en fejlbesked ved Fido = Animal(“dog”, “pug”, “female”)
    TypeError: Animal() take no argument.

    Ellers ligner min kode nøjagtig din, til og med linje 14.

    VH Dorte

    1. Simon R. siger:

      Hej Dorte,

      Vil du lige prøve at checke om der er to underscores i din init altså at der står __init__ og ikke _init_, det er nemlig den mest typiske fejl. Hvis det ikke lige er det vil du så prøve at kopiere din kode ind på linket her og sende det som en kommentar, så kan jeg lige se det lidt bedre :)

      https://pastebin.com/

      Mvh.
      Simon

      1. Dorte G. siger:

        Yes tak for det – det virkede :)

        1. Simon R. siger:

          Godt at høre, det var så lidt :)

  • Rene M. siger:

    har lige prøvet at gå lidt videre …

    https://pastebin.com/FfJS9siS

    Dette giver mig denne fejl ,,, GRRRR ;o)

    SyntaxError: invalid syntax
    PS C:\Users\rmlas\Desktop> python .\class.py
    File “.\class.py”, line 10
    def.speak(self):

    1. Simon R. siger:

      Så både det med farven af self og fejlen kommer af at du skriver def.speak…, du vil ikke have et punktum mellem de to altså du vil have def speak ikke def.speak. Det er først når du bruger funktionen at du vil bruge det punktum. Så du kan se når jeg laver Fido, så er Fido en instans af klassen, og når man vil bruge en funktion fra klassen på en instans så bruger man . altså Fido.speak.

      Jeg håber det hjalp, OOP er ret svært at forstå i starten, så det tager lidt tid af få hovedet omkring det :)

  • Rene M. siger:

    Hej Simon,
    hvorfor får jeg ikke farvet self.

    det er som om jeg ikke får init klassen.

    https://pastebin.com/yFJJ7zkk

    mvh Renè

  • Nicky F. siger:

    Hej Simon,
    Jeg har undret mig lidt over at du ofte skriver et stort bogstav midt i et ord, når du f.eks definerer en variabel eller lign.
    I denne her video skrev du “aLive”. Hvad er grunden til at man/du blander store og små bogstaver til tider? Er det en speciel kodekultur eller lign.?

    Jeg har selv “kaget” rundt i det. Hvis jeg har defineret en variabel eller lign. med et stort bogstav, glemmer jeg det senere og så får jeg en fejl. Så jeg er begyndt at skrive alt med småt. Men gør jeg mig selv en bjømetjeneste?
    Mvh. Nicky

    1. Simon R. siger:

      Godt spørgsmål. Jeg bruger noget man kalder camelcase, det er en konvention for at skrive variable og funktionsnavne. Hvis du f.eks gerne vil lave en liste af dyr, så kan du ikke skrive følgende pga. Mellemrum
      Liste af dyr = []

      Derfor skriver jeg i stedet
      listeAfDyr = []

      Det er camelcase, du erstatter hvert mellemrum med et stort bogstav i ordet efter. Nogen bruger _ i stedet, så der ville man skrive
      Liste_af_dyr = []

      Men det gør end navne længere, hvilket jeg ikke er så glad for.

      Lige “aLive” I denne video er faktisk en “fejl” det bør jeg bare skrive alive. Husk dog at det bare er en konvention, det er udelukkende bare for at have lidt ekstra struktur, der er ikke nogen teknisk fordel ved det. Du kan se mere på Wikipedia her
      https://en.m.wikipedia.org/wiki/Camel_case

      Mvh.
      Simon

  • Allan C. siger:

    Hej,

    Skal det være ordet “self” eller kan man selv vælge et vilkårligt ord hvis man bare bruger det hele vejen igennem?

    Hilsen Allan

    1. Simon R. siger:

      Hej Allan

      Godt spørgsmål, det burde jeg lige have dækket i videoen. Men nej det behøves ikke være self, det er udelukkende en kutyme, så det er nemmere for andre at læse din kode, så længe (som du selv siger) man er konsistent om brugen af det. Mange bruger ordet ‘this’, jeg brugte selv ordet ‘me’ da jeg lærte det, så hvis et andet ord giver mere mening for dig, så bruger du bare det :)