Förstår ej klasser
Såhär tror jag det ska vara. Men det jag inte förstår är varför skriver man "Vector2D" innan (self.x..... på return för både def add(self, v): och def scalar_product(self, v): ? Har inte riktigt förstått klasser och varför man gör som man gör. Varför skriver man "v.x" och "v.y" i både add och scalar_product?
self och v är båda ett objekt Vector2D som i sig har två attribut, x och y.
v.x refererar alltså till variabeln x i objektet som kallas v.
__init__ är en konstruktor och den skapar en instans av klassen Vector2D. Den vill ha emot dock ett x och ett y för att kunna konstruera detta.
scalar_product gör samma sak som add bara att man multiplicerar x och y koordinaterna.
Nu kommer kanske frågan: "Okej, coolt, men varför??? Jag kan ju bara skriva allt i main??"
Ja, det kan du, men då blir koden först och främst extremt oläsbar. Vidare så kommer det vara väldigt svårt att bygga ut applikationen. Vad händer sedan när man vill ha kanske 6000st Vector2D? Här kan du med en for loop bara kalla på konstruktorn så är det klart. Det finns många många fler fördelar att använda sig av OOP.
Okej tack (är ny till programmering), men vad betyder instans? Är det att konstruktorn liksom skapar x och y - vilket är attributer?
Det är säkert inte så, men det känns som att self.x och v.x är samma sak? Eftersom man skriver self.x = x, och v.x ? FÖRLÅT jag är väldigt ny till det här och klasser gör mig förvirrad. Jag vet inte ens om jag vet vad ett objekt är.
En klass som Vector2D är bara en design. Det säger helt enkelt vad det betyder att vara en Vector2D. I detta fallet behöver man ange ett x och y för att kunna skapa en st Vector2D.
Tänk dig att du och jag skapar ett företag där vi säljer bilar. Innan vi kan börja producera en bil måste vi först göra en blueprint. När allt detta är på plats så kan vi sedan producera bilar. Att kalla på konstruktorn är samma sak som att en maskin(er) konstruerar en bil. x och y - koordinaterna kan du se som materialet som går åt för att skapa bilen.
Klassen du skapat är alltså bara en blueprint för vad en Vector2D ser ut. Anledning att du måste ange vad add och dylikt gör är för att denna inte finns inbyggt. Varför? För Python eller dina IDE vet inte vad det betyder att addera två Vector2D. Det skulle likaväl kunna bara divison, eller något helt annat. Datorn kan inte läsa våra tankar och gissa "aha, i klassen xyz så betyder funktionen något att vi skall göra så här.
Self refererar till dig själv. Self är jäkligt svårt att begripa i början, det finns inga genvägar. Det kommer att klicka helt randomly någon gång när du sitter med det, tro mig.
Helt enkelt. När vi refererar till self, så refererar vi till oss själva.
Om du har två st Vector2D:
första = Vector2D(....)
andra = Vector2D(....)
Att kalla på första.x ge dig x-koordinaten för första. Att kalla på andra.x ger dig x.koordinaten för andra.
i funktionen add tar vi emot self och v. Du behöver aldrig berätta för Python vad self är, för self är en referens till objektet.Låt mig förklara:
v1.add(v2), här säger vi att v1 kallar på en funktion add. v1 är ett objekt, eller snarare en instans av klassen Vector2D. Objektet som kallar på någon funktion i klassen är alltid self. I detta fallet är self = v1. v som vi tar emot måstet vara en annan vektor, vi har dock inte tagit hänsyn till detta. Det är en bug som kommer göra att allt krashar om du matar in något annat, prova ex med en sträng. Det kanske blir klarare när du istället skriver ut v2.add(v1) så ser du att det blir samma sak.
Varför?
För att a+b = b + a, det enda som skiljer är nu att self = v2.
Notera att Self är mycket mer komplicerad än det jag beskrivit ovan, men detta duger för nuvarande. Self (kallas för 'this' i många andra språk) är ett sådant koncept som kommer klicka efter ett tag. Det kommer kännas helt ologiskt och magiskt till det helt plötsligt inte gör det längre. När det väl klickar kommer du inte förstå varför du inte fattade det från början så stressa inte. Ha du tålamod så kommer det att lösa sig.
En kompletterande förklaring:
de allra enklaste exemplen på klasser och instanser är ju variabler av vanliga typer, tex int:
om du skall läsa in 2 heltal och addera dem behöver du 2 instanser av int, tex a och b.
summa=a+b
python har redan inbyggt stöd för att addera int:ar men inte för vektorer med addition och skalärprodukter, därför går exemplet ut på att bygga såna metoder/funktioner.
det är inte konstigare med två instanser av vektorn ovan.
om du går lite vidare med Python kommer du att stöta på en modul som heter numpy, den stöder allt som har med linalg att göra.
Man kan också säga att en klass är som en ritning av ett hus och instans är själva huset