Introduktion till programmering SMD180. Föreläsning 12: Klasser och objekt

Relevanta dokument
Klasser och objekt, referenser Grundkurs i programmering med Python

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 5-6 Innehåll

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Övning 6. Ali Tofigh 24 Oktober, 2006

Introduktion till programmering SMD180. Föreläsning 8: Listor

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Introduktion till programmering SMD180. Föreläsning 9: Tupler

Introduktion till programmering D0009E. Föreläsning 9: Tupler och dictionaries

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Introduktion till programmering SMD180. Föreläsning 3: Funktioner

5. En metod som anropar sig själv a) får inte förekomma i Java-program b) kallas destruktiv c) kallas iterativ d) kallas rekursiv 6. Vilka värden har

EnKlass. Instans 3 av EnKlass. Instans 2 av EnKlass

Sätt att skriva ut binärträd

Kodexempel från Programmering 2 Tobias Wrigstad, Ph.D.

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

Att prova på en enkel Applet och att lära sig olika sätt att hämta data från tangentbordet. Du får även prova på att skapa din första riktiga klass.

TMS136. Föreläsning 5

Objektorienterad Programkonstruktion. Föreläsning 7 24 nov 2015

Föreläsning 8 Programmeringsteknik och Matlab DD1312. Klassmetod. Egen modul

Laboration 1: Figurer i hierarki

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Introduktion till programmering SMD180. Föreläsning 7: Strängar

Ordlistor, filhantering och ut på webben. Linda Mannila

729G04 Programmering och diskret matematik. Python 3: Loopar

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

Exempel på program med objekt Klass med main-metod. Föreläsning 3-4 Innehåll. Övning Viktiga begrepp

ID1004 Laboration 3, 5-6 November 2012

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Konvexa höljet Laboration 6 GruDat, DD1344

TDDD78 Viktiga begrepp, del 2

Tentamen, EDAA20/EDA501 Programmering

Förkortning och förlängning av rationella uttryck (s. 27 Origo 3c)

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Programmering och algoritmiskt tänkande. Tema 3, föreläsning 1 Jody Foo

Pythons standardbibliotek

Multipel tilldelning. Introduktion till programmering D0009E. Föreläsning 6: Iteration. while-satsen. Kom ihåg. Snurror kontra rekursion

Laboration: Whitebox- och blackboxtesting

Malmö högskola 2007/2008 Teknik och samhälle

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Introduktion till Datalogi DD1339. Föreläsning 3 29 sept 2014

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Kort om klasser och objekt En introduktion till GUI-programmering i Java

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Namn Stil Dokumentation Objekt-orienterad programmering OBS OBS OBS OBS OBS OBS OBS OBS

Classes och Interfaces, Objects och References, Initialization

Erfarenheter från labben

Ett objekt... Exempel: Om ni tittar er runt i föreläsningssalen ser in många olika fysiska föremål:

729G75: Programmering och algoritmiskt tänkande. Tema 1. Föreläsning 1 Jody Foo

Klasser och objekt i C#

Regression med Genetiska Algoritmer

Tentamen. 2D4135 vt 2004 Objektorienterad programmering, design och analys med Java Torsdagen den 3 juni 2004 kl

Introduktion till arv

729G74 IT och programmering, grundkurs. Tema 3. Föreläsning 2 Jody Foo,

Språket Python - Del 1 Grundkurs i programmering med Python

Text och strängindexerade fält Grundkurs i programmering med Python

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

729G04 Programmering och diskret matematik

Föreläsning 5. När skall man använda implementationsarv? När skall man använda implementationsarv?

Kopiering av objekt i Java

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Exempel på användning av arv: Geometriska figurer

Uppgifter till tenta i 729G04 Programmering och diskret matematik. 7 augusti 2015, kl 08:00-12:00

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python TDDE24 Funktionell och imperativ programmering del 2

Extramaterial till Matematik Y

Mängder. 1 Mängder. Grunder i matematik och logik (2015) 1.1 Grundläggande begrepp. 1.2 Beskrivningar av mängder. Marco Kuhlmann

Tentamen OOP

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

729G75: Programmering och algoritmiskt tänkande. Tema 1, föreläsning 1 Jody Foo

OOP Objekt-orienterad programmering

MicroPython Ett textbaserad programmeringsspråk för Micro:bit

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

Tentamen i Introduktion till programmering

TMS136. Föreläsning 5

Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Övningsuppgifter kapitel 8

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Föreläsning 16 Arv. Jan Lönnberg T Grundkurs i programmering

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

729G04 Programmering och diskret matematik

Python Första steg. LGMA20, L9MA20 VT 2019 Jonathan Nilsson, Laura Fainsilber

TDP002 Imperativ programmering. Laborationsmaterial emacs python-mode

Föreläsning 4 Programmeringsteknik DD1310. Felhantering. Syntax. try och except är reserverade ord som används för hantering av exekverings fel.

Lektion 2: Sökagenter. Robin Keskisärkkä

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

Föreläsning 3-4 Innehåll

TATA42: Föreläsning 7 Differentialekvationer av första ordningen och integralekvationer

Datatyper. Programmering. Att definiera datatyper i Java. Laddade partiklar. (x,y) (Rx,Ry) hh.se/db2004

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Börja med att kopiera källkoden till din scheme-katalog (som du skapade i Laboration 1).

TAMS79: Föreläsning 4 Flerdimensionella stokastiska variabler

Transkript:

Introduktion till programmering Föreläsning 12: Klasser och objekt 1 1

Vad är en punkt? Matematikerns definition: en position i ett (tvådimensionellt) plan, karaktäriserad av en x-koordinat och en y-koordinat. Notation: (x,y) och om p är en punkt kan vi skriva px och py för att beteckna respektive koordinat I Python: vi skulle kunna använda en tupel (x,y). Men i stället för px och py skulle vi få skriva p[0] och p[1]... I Python: vi kan använda ett dictionary {'x' : x, 'y' : y}. Men px och py måste då skrivas p['x'] och p['y']... I Python: vi kan definiera en klass Point, sådan att om p tillhör denna klass så kan vi skriva p.x och p.y för att beteckna respektive koordinat 2 2

Klasser Definition av klassen Point: class Point: x = 0.0 y = 0.0 Att skapa ett objekt (en instans) av denna klass: p = Point() Att komma åt attributen x och y: print "x is", p.x, "and y is", p.y Att uppdatera attributen: p.x = 1.0 p.y = 3.5 3 3

Om objekt Vi känner igen notationen p.x och p.y från importerade namn, t ex math.pi och string.lowercase Objekt skiljer sig dock från moduler i och med att vi kan skapa hur många punkter vi vill, men bara importera (säg) modulen math en gång import math pi 3.14159 e 2.71878 import math p1 = Point() math p2 = Point() x 2.56 p1 y 3.14159 p1.x = 2.56 p2 p1.y = math.pi y 0.0 x 1.0 p2.x = 1.0 y 0.0 y = p2.y 4 4

Om objekt Vi säger att våra punkt-objekt är instanser av klassen Point. Oftast används termen objekt just som synonym till klass-instans (och inte i betydelsen "data i allmänhet") Objekt liknar listor och dictionaries i så motto att de är uppdateringsbara och att alias-fenomen därför kan uppstå Speciellt: när vi skickar objekt som funktionsargument skickas egentligen bara adresserna till deras plats i minnet Ny definition av vår funktion distance från kap 5: def distance(p1, p2): dx = p2.x - p1.x dy = p2.y = p1.y return math.sqrt(dx*dx + dy*dy) 5 5

Samma eller lika? "Olle och jag har samma skor" Vi menar antagligen att skorna är lika i någon mening (storlek, färg, modell,...) Att Olles skor tappar sulan påverkar inte mina skor "Olle och jag har samma mamma" Här menar vi att en och samma person har två roller Om Olles mamma bryter benet så betyder det automatiskt att min mamma också gjort det "Olle och jag har samma vikt" Våra vikter har samma värde, ett decimaltal Men tal kan inte mutera, så samma eller lika kan kvitta 6 6

Som objekt Olle skor mamma vikt 95.2 storlek sula modell färg benstatus jag skor mamma vikt 95.2 storlek sula modell färg 45 'hel' 'xp' 'gul' 'ok' 45 'hel' 'xp' 'gul' 7 7

Samma eller lika objekt Varför är distinktionen mellan samma och lika viktig? Svar: därför att likhet mellan Python-objekt är definierad som samma plats i minnet! Testet Olle.mamma == jag.mamma ger alltså det förväntade resultatet True, medan Olle.skor == jag.skor blir False, oberoende av skornas färg, storlek, etc (se figur föregående sida) Observera att detta beteende skiljer objekt från andra muterbara data som listor och dictionaries, där == snarare betyder "lika" än "samma" 8 8

Exempel Likhetstest för listor och objekt >>> x1 = [1,2,3] >>> x2 = [1,2,3] >>> x1 == x2 True därför att 1==1, 2==2 och 3==3 >>> p1 = Point() >>> p1.x = 1 >>> p1.y = 2 >>> p2 = Point() >>> p2.x = 1 >>> p2.y = 2 >>> p1 == p2 därför att p1 och p2 ligger på olika plats i minnet False 9 9

Likhetsoperatorn Vi säger att likhetsoperatorn == testar grund likhet ("samma") för objekt (jämför objektens plats), och djup likhet ("lika") för övriga data (jämför datainnehållet) Om vi vill göra tvärtom, t ex testa djup likhet för objekt: def equalpoints(p1, p2): return (p1.x == p2.x) and (p1.y == p2.y) Eller testa grund likhet för (säg) listor: def samelist(x1, x2): return id(x1) == id(x2) Not: den inbyggda funktionen id() ger platsen i minnet för ett godtyckligt argument (Ett annat lämpligt namn för samelist vore isalias) 10 10

Exempel >>> x1 = [1,2,3] >>> x2 = [1,2,3] >>> p1 = Point() >>> p1.x = 1 >>> p1.y = 2 >>> p2 = Point() >>> p2.x = 1 >>> p2.y = 2 >>> print x1==x2, p1==p2 True False >>> print samelist(x1,x2), equalpoints(p1, p2) False True 11 11

Exempel (fortsättning från föregående sida) >>> z = x1 >>> print z==x1, samelist(z, x1) True True Ofånkomligt faktum: grund likhet implicerar djup likhet Dvs: om två variabler pekar ut samma plats i minnet så måste det innehåll man kan hitta via de två variablerna vara lika 12 12

En klass för rektanglar Låt oss definiera en rektangel som en punkt i planet (övre vänstra hörnet) samt en bredd och en höjd Uttryckt som en Python-klass: class Rectangle: corner = Point() width = 0.0 height = 0.0 Att skapa en instans: box = Rectangle() box.corner.x = 5.0 box.width = 100.0 box.height = 200.0 13 13

Tillståndsdiagram box corner width height 100.0 200.0 x y 5.0 0.0 Observera hur punktnotationen motsvarar att grafiskt följa pilar exempelvis box.corner.y 14 14

Att returnera nya instanser En funktion som beräknar centrum av en rektangel: def findcenter(box): p = Point() p.x = box.corner.x + box.width/2 p.y = box.corner.y + box.height/2 return p Centrum är en punkt, alltså returnerar vi en punkt! När findcenter returnerar försvinner visserligen namnet p, men inte adressen som p står för! Jämför: def fun(x): 27 "försvinner inte" bara för att p = 27 ett namn som står för 27 gör det return 27 15 15

Objekt är muterbara Vi använder mutering när vi ändrar attributens initialvärden: p = Point() p.x = 3.0 p.y = 9.4 Vi kan naturligtvis också låta objekt mutera längre fram: def growrect(box, w, h): box.width = box.width + w box.height = box.height + h Notera avsaknaden av return-sats funktionens enda syfte är att orsaka en effekt (förändringen av det okända objektet som här går under aliaset box) 16 16

Exempel Användning av growrect: bob = Rectangle() bob.width = 100.0 bob.height = 200.0... growrect(bob, 20, 30) Notera likheten mellan objekt och stack-ramar! Stackdiagram: top-level bob growrect box w h 20 30 corner width height 100.0 200.0 x y 5.0 0.0 17 17

Objektkopiering Vi har sett hur alias-effekten kan undvikas (om man så önskar) genom kopiering En kopia av listan x fås av uttrycket x[:] En kopia av dictionary d fås av uttrycket d.copy() En kopia av ett godtyckligt objekt (en klass-instans): >>> import copy >>> p1 = Point() >>> p2 = copy.copy(p1) >>> print p1==p2, equalpoints(p1, p2) False True 18 18

Objekt som innehåller objekt Kopiering av rektangeln bob: b2 = copy.copy(bob) bob corner width height 100.0 200.0 x y 5.0 0.0 100.0 200.0 corner width height b2 Lurigt resultat: objektet bob.corner är fortfarande samma objekt som b2.corner, trots kopieringen! Viktigt: funktionen copy.copy() utför grund kopiering Önskas kopior av allt: använd copy.deepcopy() 19 19

Exempel Ett annat sätt att "växa" rektanglar: returnera en kopia, utan sido-effekter def grownrect(box, w, h): import copy newbox = copy.deepcopy(box) newbox.width = newbox.with + w newbox.height = newbox.height + h return newbox Jämför med den tidigare growrect och observera return-satsen, samt att vi här inte orsakar någon mutering av den rektangel box står för (Not: förändringen av funktionsnamnet är avsiktlig!) 20 20