Hösten 2009
Dagens lektion Klasser och objekt Referenser 2
Klasser och objekt 3
KLASSER OCH OBJEKT Relaterat data Information om en fyrkant Bredd Höjd Färg 4
KLASSER OCH OBJEKT Egna datatyper Skapa en egen specialiserad datatyp Kan innehålla variabler Kan ha funktioner knutna till sig Kan använda den som om det vore en egen entitet. Den inbyggda datatypen Tupel lagrar sekvenser av värden Den egna datatypen Rektangel lagrar information om personer 5
KLASSER OCH OBJEKT Klasser och Objekt Om den nya datatypen behöver vi berätta vilket data den har hur man använder den Detta kallas för en klass Värden skapade av en klass kallas objekt 6
KLASSER OCH OBJEKT Skapa ett nytt objekt Vid skapandet behövs oftast ett intialt värde Behöver ange vilket data ett objekt ska innehålla (attribut) Initialt värde på attributen. Konstruktorn anropas vid skapandet 7
KLASSER OCH OBJEKT Exempel på en klass Vi definierar en klass och dess namn Vi definierar en konstruktor och i den, vilka attribut som ska finnas, samt deras initiala värde class Rectangle: def init (self, w, h, color): self.w = w self.h = h self.color = color Notera den första parametern self 8
KLASSER OCH OBJEKT Att skapa ett objekt Vid skapandet av ett objekt används klassens namn samt konstruktorns parametrar förutom self rect = Rectangle(20,30, blue ) print Rektangelns färg är \%s \% rect.color 9
KLASSER OCH OBJEKT Att skapa flera objekt Notera att ett objekts attribut är kopplade till objektet och inte klassen rect1 = Rectangle(20,30, blue ) rect2 = Rectangle(30,10, yellow ) print Första rektangelns färg är \%s \% rect1.color print Andra rektangelns färg är \%s \% rect2.color 10
KLASSER OCH OBJEKT Koppla funktioner till objekt I klassen kan vi skapa funktioner som är kopplade till objekt av den klassen, metoder class Rectangle: def init (self, w, h, color): self.w = w self.h = h self.color = color def resize(self, w, h): self.w = w self.h = h 11
KLASSER OCH OBJEKT Koppla funktioner till objekt I klassen kan vi skapa funktioner som är kopplade till objekt av den klassen, metoder rect = Rectangle(20,30, blue ) print Rektangelns storlek är \%i \%i \% rect.w, rect. rect.resize(10,40) print Rektangelns storlek är \%i \%i \% rect.w, rect. 12
Referenser 13
REFERENSER Vad är en variabel? En variabel skapas i namnrummet Namnet är nyckeln och värdet är en referens till var i minnet datat finns. Variabeln används för att referera data Flera variabler kan referera samma data 14
REFERENSER Vad sker vid tilldelning? Är högerledet data, skapas en referens till datat a = 3 Är högerledet en variabel, kopieras referensen INTE datat. a = 3 # a refererar datat 3 b = a # b refererar samma 3a 15
REFERENSER Är detta ett problem? Kan datat inte förändras är detta inte ett problem heltal, flyttal, tupler, strängar Med förändringsbart data måste vi vara försiktig!!! listor, strängindexerade fält, objekt a = [1, 2, 3] b = a a[1] = -1 print a # [1, -1, 3] print b # [1, -1, 3] OBS!!! 16
REFERENSER Vad sker vid funktionsanrop? Samma sak! en parameter är en lokal variabel som tilldelas vid funktionsanropet med agumentet def foo(param1): print param1 foo(3) # param1 refererar 3 a = 4 foo(a) # param1 refererar samma 4a som a list = [1, 2, 3] foo(list) # param1 och list refererar samma lista 17
REFERENSER Kopiera en lista För att få en kopia av en lista kan vi använda modulen copy from copy import copy a = [1, 2, 3] b = copy(a) a[1] = -1 print a # [1, -1, 3] print b # [1, 2, 3] 18
REFERENSER Fortfarande haveri copy fungerar bara på endimensionella listor vad händer om vi har listor i listor? from copy import copy a = [[1,2], [3,4], [5,6]] b = copy(a) a[1][1] = -1 print a # [[1,2], [3,-1], [5,6]] print b # [[1,2], [3,-1], [5,6]] 19
REFERENSER Djup kopiering Lösningen är deepcopy Gör en kopia även listor av listor from copy import deepcopy a = [[1,2], [3,4], [5,6]] b = deepcopy(a) a[1][1] = -1 print a # [[1,2], [3,-1], [5,6]] print b # [[1,2], [3,4], [5,6]] 20