Programmering grundkurs Föreläsning 8 Jody Foo, jody.foo@liu.se
Föreläsningsöversikt, FÖ 8-9 Kurslogistik: nya pargrupper Programmeringsparadigm: Objektorienterad programmering (OOP) Klass, instans, instansvariabler, metoder Syntax för att skapa klasser Syntax för att använda klasser och objekt UML-diagram Funktioner som objekt Exempel på OOP, gränssnitt Standarder för Python. PEP8 och PEP257. Programmeringsmetod: analys, implementation, testning, felsökning
Sammanfattning av period 1 Syntax och användning av funktioner Grundläggande datatyper/datastrukturer Syntax för kontrollstrukturer (villkor, loopar) Iteration och rekursion Dela upp problem, bryta ut funktioner, introduktion till abstraktion
Objektorienterad programmering ett nytt programmeringsparadigm
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
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).
Objektorienterad programmering (OOP) En klass är en mall, en beskrivning (definition) av något som kan finnas när ett program körs. Det som finns i världen är instanser av klasser, även kallade för objekt. En klassdefinitioner används för att skapa ett objekt (instans av en klass) En klass beskriver vilka egenskaper (instansvariabler) dess instanser har och vilka beteenden (metoder) den har. (Att fundera på: jämför detta med hur moduler fungerar)
Terminologi Klass Objekt / Instans Egenskapsvariabel / Instansvariabel Metod
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? lista1.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())
Jobba med klasser och objekt (förhandsvisning)
Definition av en klass class Book(object): def init (self, title): self.title = title self.author = "Unknown" self.year = "N/A" def print_citation(self): citation = "{}. ({}). {}." print(citation.format(self.author, self.year, self.title))
Objekt, dess egenskaper och beteenden klassens namn variabler metoder
Skapa/instansiera ett objekt av en viss klass Inbyggda klasser, t.ex. listor och dictionaries har syntaktiskt socker {}, [] För användardefinierade klasser använder vi klassens namn följt ett parentespar med eventuella argument. T.ex. bok = Bok() Ett anrop till namnet på en klass skapar en instans av den klassen.
Definiera klasser, skapa objekt
Definiera en klass Python för bok över vilka klasser som finns. Varje klass lagras i en hierarki av klasser. Klasshierarkin finns för att vi ska kunna återanvända kod från "klassföräldrar", basklasser (kallas ibland även för superklasser). För att definiera en klass använder vi nyckelordet class följt av ett namn, samt ett parentespar med den nya klassens basklass. Tills vidare låter vi denna vara klassen object. Definition av ny klass, Bok. class Bok(object): pass
Skapa/instansiera ett objekt av en viss klass Inbyggda klasser, t.ex. listor och dictionaries har syntaktiskt socker {}, [] För användardefinierade klasser använder vi klassens namn följt ett parentespar med eventuella argument. T.ex. bok = Bok() Ett anrop till namnet på en klass skapar en instans av den klassen.
Vad händer när en instans av en klass skapas? 1. Python skapar ett nytt objekt (låt oss referera till den som obj1) som får en referens till den klass den tillhör samt vilken klass som är dess basklass. 2. Om metoden init är definierad i obj1s klass, anropas den metoden med en referens till obj1. 3. Om metoden init inte är definierad i obj1s klass, letar Python vidare i obj1s basklass. 4. Om metoden init inte är definierad i obj1s basklass, letar python vidare i obj1s basklass basklass 5.... o.s.v. tills python hittar en definierad init varpå den metoden körs med en referens till obj1.
Struktur hos klassdefinitioner
Klassen dess egenskaper och beteenden namn egenskaper beteenden
Klassen dess egenskaper och beteenden klassnamn instansvariabler (instans-)metoder
Definition av en klass class Book(object): def init (self, title): self.title = title self.author = "Unknown" self.year = "N/A" def print_citation(self): citation = "{}. ({}). {}." print(citation.format(self.author, self.year, self.title))
Definition av en klass class Book(object): def init (self, title): self.title = title self.author = "Unknown" self.year = "N/A" def print_citation(self): citation = "{}. ({}). {}." print(citation.format(self.author, self.year, self.title)) Nyckelordet class berättar att vi definierar en klass. Klassnamn bör vara substantiv och ska enligt standard börja med stor bokstav. Efter klassnamnet kommer namnet på klassens basklass class Book(object): betyder alltså "vi ska nu definiera klassen Book som har object som basklass"
Definition av en klass class Book(object): def init (self, title): self.title = title self.author = "Unknown" self.year = "N/A" def print_citation(self): citation = "{}. ({}). {}." print(citation.format(self.author, self.year, self.title)) Nyckelordet "def" används för att definiera metoder i en klass. Alla metoder tar in en referens till den instans som de tillhör som första argument. Python skickar detta automatiskt. Variabler som hör till en instans har "self." som prefix.
Definition av en klass class Book(object): def init (self, title): self.title = title self.author = "Unknown" self.year = "N/A" def print_citation(self): citation = "{}. ({}). {}." print(citation.format(self.author, self.year, self.title)) Metoden init är speciell. Den beskriver det som händer när en instans av klassen skapas. self är en referens till den instans metoden anropas ifrån. Python skickar med den automatiskt när ett anrop på formen objekt.metod() görs. Instansvariabler, variabler som tillhör en instans av en klass används med referensen self.
Använda objekt
Skapa en instans av en klass Klassens namn följt av ett parantespar med eventuella argument skapar en instans av en klass. Klassnamn(arg1, arg2)
Använda metoder och instansvariabler Använda metod (metodanrop) objekt.metodnamn(arg1, arg2) returvärde Använda instansvariabel (hämta värde) objekt.instansvariabel värde Tilldelning av värde till en instansvariabel objekt.instansvariabel = 5 objekt.instansvariabel = ["lista"]
Punktnotation (modul.)variabel (modul.)funktion() (modul.)klass() objekt.metod() objekt.instansvariabel a = [1, 2, 3] a.append(4) s = "hejsan" s.upper()
Vi skapar böcker class Book(object): def init (self, title): self.title = title self.author = "Unknown" self.year = "N/A" def pretty_print(self): citation = "{}. ({}). {}." print(citation.format(self.author, self.year, self.title)) bok1 Book title: "The Practice of Computing Using Python" author: "Unknown" year: "N/A" pretty_print bok1 = Book("The Practice of Computing using Python") bok2 = Book("PSwAaDSuP") bok2 Book title: "PSwAaDSuP" author: "Unknown" year: "N/A" pretty_print
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
Instansvariabler och metodanrop 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
Instansvariabler och metodanrop 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()
Instansvariabler och metodanrop class Book(object): def init (self, title): self.title = title self.author = "Unknown" self.year = "N/A" def pretty_print(self): citation = "{}. ({}). {}." print(citation.format(self.author, self.year, self.title)) bok1 = Book("The Practice of Computing using Python") bok2 = Book("PSwAaDSuP") print(bok1.title) print(bok2.author) bok1.pretty_print() print(bok2.title) print(bok2.author) bok2.pretty_print() bok1.author = "Punch, W. F., & Enbody, R" bok1.year = "2017" bok1.pretty_print()
Terminologi Klass Objekt / Instans Egenskapsvariabel / Instansvariabel Metod
Klassdiagram i UML
Klassdiagram i UML Unified Modelling Language Klassnamn namn : attributtyp namn : attributtyp = defaultvärde operation() operation() : returdatatyp operation(parameterlista) operation(parameterlista) : returdatatyp
Exempel DataRow trial : str image_file : str time : int correct_answer : str subjects_answer : str degrees_rotated : int get_error_type() : int
Speciella metoder i Python exempel: init, str
Speciella metoder, börjar och slutar med Metoden init används när en instans av en klass skapas Metoden str används när en instans av en klass (ett objekt) ska visas som en sträng
Instansvariabler och metodanrop class Book(object): def init (self, title): self.title = title self.author = "Unknown" self.year = "N/A" def str (self): citation = "{}. ({}). {}." return citation.format(self.author, self.year, self.title)) bok1 = Book("The Practice of Computing using Python") bok2 = Book("PSwAaDSuP") print(bok1) print(bok2)
Funktionsobjekt Alla värden (data) är objekt i Python. Definierade funktioner kan också ses som en typ av värden - funktionsobjekt
Funktionsobjekt Klasser kan instansieras och producera objekt I Python är även funktioner objekt. En funktion: def hejsan(): print("hejsan") Ett funktionanrop: hejsan() Funktionsobjektet: hejsan
Exempel på funktionsobjekt def print_hello(): print("hello World!") bacon = print_hello bacon() # utskrift # Hello World!
Grafiska gränssnitt exempel på tillämpning av objektorienterad programmering
GUI = Graphical User Interface Grafiskt gränssnitt Gränssnitt - något som ligger mellan två andra saker. I vårt fall: det mellan användaren och programmet
Widgets (window gadgets) Label Text input field Label Text input field Drop Down Radio Button 1 Radio Button 2 Radio Button 3 Selected Checkbox Unselected Checkbox Selected Checkbox Unselected Checkbox Button 1 Button 2
"Bakom" kulisserna Widgets, instanser av olika typer av GUI-element. Olika typer av fönster: dialogrutor, öppna dokument etc Behållare (Containers) som kan innehålla widgets: Frame, Panel, Canvas Funktionalitet för att ordna layout av widgets etc Koppling mellan widgets och funktioner/metoder.
Program- och interaktionsflöd för grafiska gränssnitt
Exempel: GUI
Exempel: GUI Name Title Sex Amanda the Giant Slayer Female Male This is the story of Amanda, the Giant Slayer. Ever since the day she was born, Amanda had a unwashed look. Amanda had a magic bag. Sadly, there is not much else to say about her. Appearance unwashed Other has magic bag is happy has secret Reset Quit
Programflöde: GUI Icke-linjär interaktion Reaktivt gränssnitt - tät återkoppling Interaktion via mus och tangentbord Interaktion med en begränsad och standardiserad uppsättning widgets (oftast)
Syfte med att skapa grafiska gränssnitt i Python med tkinter Introduktion till GUI-programmering Widgets i tkinter få saker att hända när man interagerar med widgets bestämma layout för widgets i ett GUI
Om tkinter Olika widgetklasser finns: faktiska gränssnittskomponenter är instanser av klasserna Olika inställningar kan ges när man skapar en widget. Widgets kan placeras i ett GUI på tre sätt - det finns tre "geometry managers" (i andra språk också kallade för "layout managers").
Widgets http://pythonwiki.tiddlyspot.com/#%5b%5bvisual%20guide%20to%20tkinter%20widgets%5d%5d