Programmering och algoritmiskt tänkande Tema 3, föreläsning 1 Jody Foo
Tema 3: Översikt Objektorienterad programmering: fortsättning Tema 1 och 2: Exempel på att använda och skapa algoritmer Tema 3: strukturera kod (för t.ex. en algoritm eller en mängd algoritmer) med hjälp av Pythons stöd för OOP. Introuppgift: öva och konkretisera mönster för OOP. Temauppgift: Objektorienterad implementation av genetiska algoritmer
Föreläsningsöversikt Undantag - exempel på hur användning av instanser Egna klasser (repetition) Objektorienterad design av ett program: en klass som behållare (OBS! Superviktigt mönster)
Snabbrepetition Objektorienterad terminologi
Klasser och objekt Klass: mallkod som används när en instans av en klass skapas Klasser används som datatyper (datatyperna i Python är klasser) Exempel: "3953 bananer!" är ett värde av datatypen str ("string"/sträng). Instans och objekt är synonymer. Objekt är faktiska värden som skapas genom att använda definitionen av en klass. Exempel: listan ["hej", 36, True] är en instans av klassen list.
Instansvariabler och metoder En grundläggande anledning som bidragit till utveckling av objektorienterade programmeringsspråk är behov av att kunna gruppera ihop en specifik datastruktur och funktionalitet som jobbar med just den datastrukturen: inkapsling. Klassen är mallen för datastrukturen som består av instansvariabler (variabler som är kopplade till en specifik instans). I Python använder man self för att referera till den den egna instansen. En funktion som är definierad i en klass är bundna till den klassens instanser och kallas för metod.
En klass klassens namn egenskaper beteenden
Varning för kluvna tungor! med ordet "egenskap" (på svenska) syftas det på "egenskap" som begrepp i vardaglig bemärkelse I Python finns termerna attribute och property där property är ett underordnat begrepp till attribute (property är en typ av attribute)
Vanliga mönster när man designar en klass Namngivning av klasser: substantiv i singular Namngivning av metoder: verb Namngivning av instansvariabler: substantiv i singular OBS! Om klassen representerar en samling objekt, dvs fungerar som en behållare, använd inte beskrivning av innehållet. Ett vanligt mönster är att använda ett suffix, t.ex. Collection, Set eller List
Exempel på klassnamn DataPoint DataPointCollection Word Sentence Paragraph Document Person ContactList Book Library BookCollection
Vanliga prefix till metodnamn get_: hämta ett värde från ett objekt (antingen beräknat eller direkt från ett attribut) set_: sätt att värde add_ remove_ load_ save_
Undantag Exceptions
Exceptions - undantag Exceptions (sv undantag) är ett sätt att hantera fel i kod som kan utlösas (eng throw/raise). Vid fel kan ett undantag utlösas. Programmet avbryter sitt normala flöde för att gå in i "undantagsläge". Finns inget specificerat undantagsläge, kraschar programmet.
Undantag i Python Om man vill hantera undantag i Python lägger man koden som kan utlösa undantag i ett try-block. Undantag hanteras sedan i ett except-block.
Exempel på undantag i Python ZeroDivisionError IOError IndexError KeyError TypeError
Mönster för undandagshantering i Python try: # här lägger man koden som kan utlösa ett undantag except [typ av exception] [as <namn på undantagsinstans>]: # här lägger man koden för vad som ska hända Här ska inte hakparenteserna skrivas ut, utan visar att det som står innanför dem är valfritt. Det som står inom mindre än/större än-tecken måste vara med. I det här fallet bara om 'as' används. Mindre än/större än-tecknena ska inte heller stå med.
Exempel: Fånga undantag letters = ["a", "b", "c", "d", "e", "f"] try: l_index = 0 while True: print(letters[l_index]) l_index += 1 except: print("an exception was raised.")
Exempel: Fånga och instansiera undantag letters = ["a", "b", "c", "d", "e", "f"] try: l_index = 0 while True: print(letters[l_index]) l_index += 1 except Exception as error: print("an exception was raised.") print(error)
Exempel: Fånga specifikt undantag letters = ["a", "b", "c", "d", "e", "f"] try: l_index = 0 while True: print(letters[l_index]) l_index += 1 except IndexError: print("index " + str(l_index) + " is out of bounds.")
Exempel: Fånga och instansiera specifikt undantag letters = ["a", "b", "c", "d", "e", "f"] try: l_index = 0 while True: print(letters[l_index]) l_index += 1 except IndexError as index_error: print("index " + str(l_index) + " is out of bounds.") print(index_error)
Olika sätt att använda undantag För att fånga potentiella fel i koden och åtgärda dem Som ett alternativ till "vanlig" flödeskontroll/if-satser
Kontroll av argument med hjälp av flera undantag def get_dog_desc(dog_dict): try: output_string = "My name is " + dog_dict['name'] + " " output_string += "and I am " + str(dog_dict['age']) + " years old." return output_string except TypeError as type_error: print("argument not a dictionary") print(type_error) except KeyError as key_error: print("wrong keys in dictionary.") print(key_error)
Kontroll av argument med hjälp av flera undantag som ett fall def get_dog_desc(dog_dict): try: output_string = "My name is " + dog_dict['name'] + " " output_string += "and I am " + str(dog_dict['age']) + " years old." return output_string except (TypeError, KeyError) as error: print("not a dictionary or key not present in dictionary.") print(error)
Objekt som behållare (tänk matrosjkadockor)