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.
Pænt goddag…
Det kunne være rart, hvis man kunne indsætte “billeder” (typisk skærmdumps) her i kommentarfeltet ;-)
Kan man konfigurere (lave en indstilling) i ATOM, så man ikke altid skal starte med at skrive “python” i terminalen inden programmet køres, således at ATOM forstår, at vi altid vil køre et py-program?
Hej Sonny,
Mht. at sætte billeder ind, så prøv at brug kontakt formularen til Nemprogrammering, det er dem der kan ændre det :) Hvis du gerne vil dele kode, så anbefaler jeg pastebin, eller bliver din indenteringer/indryk ikke vist rigtigt.
pastebin – https://pastebin.com/
Mht. at konfigurere Atom. Det kan man teknisk set (da man nærmest kan alt i terminalen/powershell). For lige at gi en kort forståelse, når du skriver ‘python fil.py’ så er der et program på din computer, hvor programfilen hedder python.exe, det er dette program der bliver kørt når du skriver python i terminalen. Det programmet så gør det er at tage din ‘fil.py’ og linje for linje oversætter den så din kode, til hvad der skal ske (det tekniske term er at den oversætte koden til ‘instruktioner’ som din CPU så kan udføre). Så det er derfor man skriver python, hvis du så ville lave et slags hack, hvor man ikke skal skrive det, så ville du ikke kunne skrive andre kommandoer i terminalen, så som ls, cd osv.
Hvis man sidder og laver python professionelt ved et firma, så har man tit det der hedder en IDE i stedet for Atom (som man kalder en editor) en IDE er lavet specifikt til et programmeringssporg (eller en lille samling) og disse vil have en “kør” knap hvor man trykker og så kør ens program, men jeg valgte at bruge Atom her, da der giver en bedre forståelse for hvad der sker bagved.
Du kan se den lille ekstra video jeg har lavet her, den vil hjælpe lidt på forståelsen, den er egentlig lavet til hvis man har et problem med at skrive python eller pip i terminalen, men den er stadig fin at se selvom man ikke har de problemer :)
https://drive.google.com/file/d/1ITozcPn1cloUscvNX95KI2j6Pkn0SiqY/view
Kontakt – https://www.nemprogrammering.dk/wp/kontakt/
speak() må ikke stå inden i en print()-funktion.
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
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
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
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
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 :)
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 :)
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
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
Yes tak for det – det virkede :)
Godt at høre, det var så lidt :)
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):
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 :)
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è
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
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
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
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 :)