2015-09-21, 21:50
  #1
Medlem
Yppsilons avatar
Hej!

Jag kr sommarkursen i programmering fr Python, och skulle behva en mer grundlggande samt genomgende beskrivning i hur alla attributen och parametrar relateras mellan en klass och dess metoder.

Vet ni ngon bra kurslitteratur eller hemsida som successivt och lngsamt gr igenom detta? Skulle uppskattas enormt!
Citera
2015-09-21, 22:08
  #2
Medlem
thehater123s avatar
r det ngot specifikt du inte frstr?

Klass: Ritning av ett objekt
Instans: Det faktiska objektet

En klass kan ha mnga instanser.

Vid anrop till en metod skickas en pekare (self i python) med som pekar till objektets instans s att du kan komma t objektets instansvariabler (ocks kallade fltvariabler) samt vriga metoder i objektet.

Arv och polymorphism kan du lsa om p wikipedia. Just fr python r just polymorphism inte s tyligt eftersom python anvnder sig av duck-typing, dvs. "om den kan kvacka som en anka s antar vi att det r en anka". Problemet r att man d fr alla fel i runtime, till skillnad i frn java eller C++ dr man upptcker felen tidigare nr man kompilerar programmet. Python r alts dynamiskt, men mycket "farligare" att programmera i, d alla typfel mste hittas medans man kr programmet.

Du kan tnka dig ett objekt som en bil t.ex. den har en metod, ppna drr.
Bilen bestr av flera andra objekt, drrar, dck osv som r dess komponenter.
Drfr kallas detta fr "composition" inom objektorientering.

Bcker finns det gott om p typ amazon. Jag har dock aldrig gt en python bok.
__________________
Senast redigerad av thehater123 2015-09-21 kl. 22:19.
Citera
2015-09-21, 23:22
  #3
Medlem
Yppsilons avatar
Det r mer syntaxen jag har svrt att greppa.

Citat:
class Kakmonster:
'Hller reda p hur mnga kakor som en person har tit'
kakburk = 0
def __init__(self, namn):
self.namn = namn
self.tna_kakor = 0
def __str__(self):
return self.namn + ' har tit ' + str(self.tna_kakor) + ' kakor.'
def t_kaka(self):
self.tna_kakor += 1
Kakmonster.kakburk -= 1
Kakmonster.kakburk = 3

namn = input("Hej, vad heter du? ")
person = Kakmonster(namn)

while Kakmonster.kakburk != 0:
svar = input("Vill du ta en kaka? ")
if svar.lower().startswith('j'):
person.t_kaka()
print(person)
print("Kvar i kakburken: ", Kakmonster.kakburk)


Varfr ska en klass initieras med __init__?

Varfr har vi self i __init__ som parameter?

Om jag skriver globalt.
person = Klassen(parameter), vad har jag egentligen gjort hr? Hur fr programmet self=person i anroppen senare? Och hur fungerar self.namn = namn...?

Metoder/funktionerna r jag rtt sker p. Men hur klassen hanterar funktioner, och hur man anropar en klass fattar jag inte...
__________________
Senast redigerad av Yppsilon 2015-09-21 kl. 23:27.
Citera
2015-09-21, 23:45
  #4
Medlem
thehater123s avatar
init r en konstruktor.
Den kallas frst nr du skapar objektet fr att initiera saker.

self anvnds fr att stta fltvariabler i objektet. I python behver du inte deklarera dessa, men hade det varit t.ex. java s hade du gjort.

Kod:
public class Kakmonster {
   private String namn;

   public Kakmonster(String namn) {
      this.namn = namn;
   }
 ...
}

Det r lite tydligare vad som hnder hr. Du har en variabel namn som skickas in i konstruktorn (i java heter den inte init utan namnet p klassen), och fr att skilja mellan namn som ligger i objektet och namn som variabel i konstruktorn anvnds this. This r samma sak som self i python.

I java behver du inte anvnda this heller, nedan r t.ex. helt okej:

Kod:
public class Kakmonster {
   private String kakNamn;

   public Kakmonster(String namn) {
      kakNamn = namn;
   }
 ...
}

I python mste du anvnda self dock. Self skickas med i alla anrop till metoder p objekt, precis som this skickas med i smyg i java. I python s r self synlig, du mste deklarera den som en parameter i dina metoder.

This och self refererar till objektet som du arbetar med.

Du kan anropa metoder "p dej sjlv" mha. self t.ex. genom self.t_kaka() precis som du kan gra person.t_kaka() nr du har tilldelat instansen till variabeln person.

Du frstr, init retunerar "self" nr den r klar. Init r egentligen metoden Kakmonster(String namn) som du anropar nedan fr att skapa en instans av Kakmonster. Self skickas med implicit, precis som den skickas med implicit nr du gr person.t_kaka()

Egentligen s gr python t_kaka(person) nr du skriver person.t_kaka(). Person pekar p objektet, vilket d blir self inne i metoden.

Sorry om jag krnglade till det nu, haha.

Kakmonster.kakburk r ett specialfall. Dr refererar du till kakburk som ligger i klassen och inte i instansen.

I java hade man deklarerat kakburk som static. Du fr lsa p skillnaden mellan instansvariabler och statiska variabler i klasser. Instansvariabler finns med i varje instans du skapar, varje "Kakmonster" objekt t.ex., men kakburk r delad mellan alla kakmonster och ligger i klassen inte i dom enskilda kakmonster objekten.
__________________
Senast redigerad av thehater123 2015-09-22 kl. 00:05.
Citera
2015-09-22, 00:11
  #5
Medlem
Yppsilons avatar
S om jag frstr detta rtt..

Self. anvnds inne i klassen som den generella parametern till alla metoder? Nr jag tilldelat som
person = Kakmonster() s gr jag "person" till ett objekt som byts ut mot "self" inne i klassen?

I __init__ s har jag (self, namn). Vad hnder nr jag gr self.namn = namn? Blir lite virrig av detta

Haha har s mnga frgor..Men frsker hlla dem konkreta. Hittar en avvgning mellan att klura ut men ocks frga det som bara tar ondigt med tid att klura ut..
Citera
2015-09-22, 00:12
  #6
Medlem
thehater123s avatar
Jag kan ju ocks tillgga att jag tror att det r lttare att lra sig objektorientering i Java n i Python. I Java r allting klasser, och det r typat och mer rent och tydligt.

I Python kan du gra lite som du vill, det r mer otydligt hur saker fungerar.
__________________
Senast redigerad av thehater123 2015-09-22 kl. 00:35.
Citera
2015-09-22, 00:17
  #7
Medlem
thehater123s avatar
Citat:
Ursprungligen postat av Yppsilon
person = Kakmonster("Charlie")
Hr skapar du ett nytt kakmonster som har namnet Charlie. Detta kakmonster tilldelas till variabeln person. person hller nu en referens till kakmonstret med namn "Charlie".

Init kallas med namnet "Charlie" i det hr fallet, self blir en referens till det nya kakmonstret.

Citat:
Ursprungligen postat av Yppsilon
I __init__ s har jag (self, namn). Vad hnder nr jag gr self.namn = namn?

Hr tillderlar du en variabel namn som ligger i kakmonstret med vrdet som du fr in frn variablen namn i init metoden.

Init r precis som alla andra metoder, den tar tv argument, self och namn.
Men du vill ju spara namn i kakmonsterinstansen som du hller p och skapar.
Det gr du med hjlp av self.

s, "self.namn" refererar till variabeln namn i din kakmonsterinstans
och bara "namn" r variabeln som kommer frn init metodens parameterlista.
__________________
Senast redigerad av thehater123 2015-09-22 kl. 00:41.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in