init är en konstruktor.
Den kallas först när du skapar objektet för att initiera saker.
self används för att sätta fältvariabler i objektet. I python behöver 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 händer här. Du har en variabel namn som skickas in i konstruktorn (i java heter den inte init utan namnet på klassen), och för att skilja mellan namn som ligger i objektet och namn som variabel i konstruktorn används this. This är samma sak som self i python.
I java behöver du inte använda this heller, nedan är t.ex. helt okej:
Kod:
public class Kakmonster {
private String kakNamn;
public Kakmonster(String namn) {
kakNamn = namn;
}
...
}
I python måste du använda 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 måste deklarera den som en parameter i dina metoder.
This och self refererar till objektet som du arbetar med.
Du kan anropa metoder "på dej själv" mha. self t.ex. genom self.ät_kaka() precis som du kan göra person.ät_kaka() när du har tilldelat instansen till variabeln person.
Du förstår, init retunerar "self" när den är klar. Init är egentligen metoden Kakmonster(String namn) som du anropar nedan för att skapa en instans av Kakmonster. Self skickas med implicit, precis som den skickas med implicit när du gör person.ät_kaka()
Egentligen så gör python ät_kaka(person) när du skriver person.ät_kaka(). Person pekar på objektet, vilket då blir self inne i metoden.
Sorry om jag krånglade till det nu, haha.
Kakmonster.kakburk är ett specialfall. Där refererar du till kakburk som ligger i klassen och inte i instansen.
I java hade man deklarerat kakburk som static. Du får läsa 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.