729G06 Programmering och logik Info om pythondelen & introduktion till objektorienterad programmering.
Översikt Kursinformation Vad är objektorienterad programmering Skapa och använda objekt Enstaka objekt Objekt i listor Inför labb 1: lektioner
All kursinfo finns på kurshemsidan http://www.ida.liu.se/~729g06
Personal på Python-delen Kursansvarig, lärare, examinator Jody Foo Labbassistenter Cassandra Svensson [cassv004] Isabella Koniakowski [isako708] Jonas Rybing [jonry16] Sarah Albertsson [saral29] Kursadministratör Annelie Almquist
Programmering (Python) Examinationsmoment LAB1: 1,5hp PRA1: 1,5hp Föreläsningar: 5 st Lektioner: 5 st Handledda labbtillfällen: 17 st
Python-delen: 4 kapitel Kapitel 1: Där vi lär oss vad OOP är Föreläsningar: Intro till OOP (FÖ 1 + FÖ2) Lektioner: Övningar i att skriva OO kod Laborationer: Labb 1, Ninjas vs zombies & Labb 2, Bygga klasser och objekt. Kapitel 2: Där vi oss använda börja använda OOP Föreläsningar: Undandtag, arv, klassdiagram Lektion: modellering och arv, inför labb 3 Laboration: Labb 3 Genetiska algoritmer
Python-delen: 4 kapitel Kapitel 3: Där vi lär oss om GUI-programmering Föreläsning: GUI med Tkinter och Python, eventbaserad programmering. Objektorienterad design, strukturera GUI-kod Laboration: Labb 4: GUI-gränssnitt till sago-generator. Kapitel 4: Där vi tillämpar vad vi lärt oss Lektion: Introduktion och genomgång av projektet Projekt: Individuellt projekt
Labbredovisningar och inlämning Muntlig redovisning innan inlämning vid redovisningstillfällen Inlämning innan muntlig redovisning godkänns ej. Inlämning via RT E-post till 729g06@ida.liu.se varpå en bekräftelse skickas av systemet. Komplettering Skickas in genom att svara på den tidigare bekräftelsen. Riktlinjerna måste följas
Redovisning, inlämning och komplettering Gör klart labben Muntlig redovisning Skicka in till 729g06@ida.liu.se Få bekräftelse på inlämning och sedan återkoppling från labbassisten. Komplettera vid behov Skicka komplettering som svar på bekräftelsemailet
Projektet och delexamination Examination, del 1 Projektbeskrivning som skickas in enligt mall, senast 2016-05-15. Examination, del 2 Redovisning och demonstration för kurskamrater. För att få göra del 2 måste del 1 godkänd inlämning vara gjord (dvs själva inlämnandet av en projektbeskrivning som följer mallen). Examination, del 3 Implementation av projekt.
Upplägg av Python-delen
Classroom Notebook OneNote - hur många använder det? Pilot för att se hur det fungerar Ej obligatorisk användning. Tre delar Gemensam Notebook Kursmaterial Egna Notebooks
Camedin: digital handuppräckning System vi kommer att använda på labbar och lektioner Varje handledare har en kö, ni kan ställa er i köerna och behöver inte hålla upp handen. Mer info kommer skickas ut och komma ut på kurswebben + OneNote
Objektorienterad programmering?
Ni har redan använt objekt... # en lista är ett objekt lista1 = [] # Ett objekt har metoder som man meddelar att man vill köra genom # att använda punktnotation. Vad händer egentligen nedan? lista.append("en sträng")
Ni har redan använt objekt... # en lista är ett objekt a_string = "visst är python roligt!" # Ett objekt har metoder som man meddelar att man vill köra genom # att använda punktnotation. Vad händer egentligen nedan? print(a_string.upper())
Objekt är instanser av klasser-
En klass är en mall som används för att skapa ett objekt objekt kallas också för instanser
Programmeringsparadigm Funktionell programmering Procedurell programmering Logikprogrammering Objektorienterad programmering
Objektorienterad programmering Ett alternativ till att använda funktioner för att strukturera kod: Objekt istället för abstrakt datatyp Bättre sätt att organisera större projekt - återanvändning C++, Objective-C, C# och Java är exempel på andra OO programmeringsspråk
Repetition: Abstrakta datatyper Att modellera ett problem och representera problemet. Fokus ligger inte på implementationsdetaljer utan på att skapa en meningsfull representation av domänen/ problemet. I funktionella och imperativa språk används ofta abstrakta datatyper (ADT) som en abstraktionsmodell.
Varför räcker inte ADT:er? ADT (Abstrakt Datatyp) = datastruktur + funktioner Det finns ingen hård koppling mellan data och dess funktioner - olika data kan skickas till alla funktioner vilket kan orsaka fel och buggar.
Exempel Två abstrakta datatyper: bok och person (t.ex. om vi vill skapa ett bibliotekssystem) Alla funktioner ligger på samma nivå: create_book(), create_contact() borrow_book(), return_book(), change_address() etc. Det är upp till programmeraren att hålla redan på att ingen kan låna en kontakt, eller byta adress på en bok etc.
Objektorienterad programmering (OOP) Objekt är i fokus jämfört med funktioner i fokus som vid funktionell programmering. Man försöker relatera data och metoder till objekt. Både data och metoder kan "ägas"/tillhöra objekt (inkapsling) Objekt, dess egenskaper och beteenden (vad objektet kan göra och vad man kan göra med objektet).
Semiotiska triangeln, Triangle of reference (Ogden & Richards 1923)
I objektorienterad programmering Klass Variabel/Referens Objekt
Klasser jmf med objekt och instanser En klass är en mall, en beskrivning av något som kan finnas i världen. En klass beskriver vilka egenskaper (variabler) klassen har och vilka beteenden (metoder) den har. Det som finns i världen är instanser av klasser, även kallade för objekt.
Hur skapar vi en instans av en klass? Anropa klassens konstruktor, en speciell metod som skapar instanser av en klass. Jämför med create_vertex() när man använder ADT:er. Konstruktorn heter samma sak som klassen. För klassen Turtle heter alltså konstruktorn Turtle() Konstruktorer "returnerar" nya objekt (returnerar egentligen inte eftersom de inte är funktioner, men man kan tänka så)
Exempel från sköldpaddevärlden turtle-modulen i 729G04: funktionell ansats... men man kan också använda modulen på ett objektorienterat sätt Skapa fler än en sköldpadda, fler sköldpaddsobjekt Sköldpaddors egenskaper: position, riktning, färg, form Sköldpaddors beteenden: de kan svänga, gå framåt, bakåt, göra sig osynliga, gå till en plats etc
Demo 1 https://trinket.io/library/ trinkets/c09662b876
Objekt, dess egenskaper och beteenden klassens namn egenskaper beteenden
Objekt, dess egenskaper och beteenden klassens namn variabler metoder
Objekt, dess egenskaper och beteenden stor begynnelsebokstav! Dog name age talk
Definition av en klass class Dog(object): def init (self, namev): self.name = namev self.age = 0 def talk(self): print("voff, jag heter " + self.name)
Punktnotation (modul.)objekt.variabel (modul.)objekt.metod() a = [1 2, 3] a.append(4) s = "hejsan" s.upper()
Vi skapar några hundar class Dog(object): def init (self, namev): self.name = namev self.age = 0 def talk(self): print("voff, jag heter " + self.name) hund1 Hund name: "Pluto" age: 0 talk hund1 = Dog("Pluto") hund2 = Dog("Lassie") hund2 Hund name: "Lassie" age: 0 talk
Testar hundarna class Dog(object): def init (self, namev): self.name = namev self.age = 0 def talk(self): print("voff, jag heter " + self.name) hund1 = Dog("Pluto") hund2 = Dog("Lassie") print(hund1.age) print(hund1.name) hund1.talk() print(hund2.age) print(hund2.name) hund2.talk()
Ändra värden hund1 Hund name: "Pluto" age: 4 hund1.age = 4 hund2.age = 8 talk hund2 Hund name: "Lassie" age: 8 talk
Testar hundarna class Dog(object): def init (self, namev): self.name = namev self.age = 0 def talk(self): print("voff, jag heter " + self.name) hund1 = Dog("Pluto") hund2 = Dog("Lassie") print(hund1.age) print(hund1.name) hund1.talk() print(hund2.age) print(hund2.name) hund2.talk()
Terminologi Klass Objekt / Instans Egenskapsvariabel / Instansvariabel Metod
Metoden str () Metoden str () berättar för python att hur instanser av klassen ska representeras som text Om den inte är definierad returneras en beskrivning av objektets typ samt var i minnet den finns t.ex. '< main.test instance at 0x101c1d290>' Om man definierar str () kan man bestämma hur objekt av en klass ska representeras som sträng
Vi provar lägga till str ()
Några ord om getters/setters Det "pythonska" sättet att koda är att inte använda getters/ setters. Dock är getters/setters vanliga i många objektorienterade språk och ett bra sätt att kapsla in/gömma data i syfte att göra det lättare att omfaktorera kod (t ex byta datatyp från lista till dictionary) Man använder hund1.get_name() istället för hund1.name, och hund1.set_name( Fido ) istället för hund1.name = Fido (även inne i klassens metoder!)
Vi provar lägga till getters och setters