42
729G06 Programmering och logik OOP: Klassdiagram, arv Allmänt: Undantagshantering

729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Embed Size (px)

Citation preview

Page 1: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

729G06 Programmering och logikOOP: Klassdiagram, arv

Allmänt: Undantagshantering

Page 2: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Upplägg av Python-delen

Page 3: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Dagens föreläsning⁃ En sista repetition av begreppen klass, instans, instansvariabel, instansmetod, konstruktor, self

⁃ Klassdiagram: Vad? Varför? Hur?

⁃ Arv: hierarkisk återanvändning av kod

⁃ Undantag och undantagshantering: ett system för att hantera saker som inte fungerar som de ska.

Page 4: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Begrepp dess tillämpningar som ni måste förstå och kunna användaOm ni inte kan dem, lär er dem genast!

⁃ Klass och instans: skillnad och relation mellan begreppen

⁃ instansvariabler, instansmetoder, self

⁃ Skapa en instans: Vad är en konstruktor? Hur ser anrop till en konstruktor ut? Vad gör metoden __init__()?

⁃ Syntax:

Punkt-notation för moduler, klasser, instanser

import av moduler

Page 5: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

En klass är en mall som används för att skapa ett objekt

objekt kallas också för instanser

Page 6: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

En klass är definierar de instansvariabler och metoder som dess instanser kommer ha.

Page 7: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Instansvariabler och metoder kallas ibland gemensamt för en klass attribut

Page 8: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Instansiering

defmove_to(self,x,y):self.my_turtle.setpos(x,y)…

draw_square(self):foriinrange(4):…

defspit(self):self.my_spit.fd(100)self.my_spit.bk(100)

name:strmy_turtle:turtle.Turtlemy_spit:turtle.Turtle

Pokemon

move_to(self,x,y)draw_square(self)spit(self)

name:"Bulbasaur"my_turtle:<turtle.Turtleat0x105f1a3c8>my_spit:<turtle.Turtleat0x105fb9160>

p1 : Pokemon

p1=Pokemon("Bulbasaur")

Page 9: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Metodanrop

defmove_to(self,x,y):self.my_turtle.setpos(x,y)…

draw_square(self):foriinrange(4):…

defspit(self):self.my_spit.fd(100)self.my_spit.bk(100)

name:strmy_turtle:turtle.Turtlemy_spit:turtle.Turtle

Pokemon

move_to(self,x,y)draw_square(self)spit(self)

name:"Bulbasaur"my_turtle:<turtle.Turtleat0x105f1a3c8>my_spit:<turtle.Turtleat0x105fb9160>

p1 : Pokemon

p1.move_to(100,400)

p1=Pokemon("Bulbasaur")

I Python är p1.move_to(100,400)samma sak somPokemon.move_to(p1,100,400)

OBS! Detta är inte fallet för alla objektorienterade språk

Page 10: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Grammatik och lexikon för importer

import_stmt::="import"module["as"name](","module["as"name])*|"from"relative_module"import"identifier["as"name](","identifier["as"name])*|"from"relative_module"import""("identifier["as"name](","identifier["as"name])*[","]")"|"from"module"import""*"module::=(identifier".")*identifierrelative_module::="."*module|"."+name::=identifier

https://docs.python.org/3.4/reference/simple_stmts.html#import

Ovanstående notation är BNF (Backus Normal Form) som ofta används inom datavetenskap för att beskriva kontextfria grammatiker.

Page 11: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Grammatik och lexikon för importer

import_stmt::="import"module["as"name](","module["as"name])*|"from"relative_module"import"identifier["as"name](","identifier["as"name])*|"from"relative_module"import""("identifier["as"name](","identifier["as"name])*[","]")"|"from"module"import""*"

Det finns 4 varianter -importrandom,turtleast

Page 12: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Grammatik och lexikon för importer

import_stmt::="import"module["as"name](","module["as"name])*|"from"relative_module"import"identifier["as"name](","identifier["as"name])*|"from"relative_module"import""("identifier["as"name](","identifier["as"name])*[","]")"|"from"module"import""*"

Det finns 4 varianter -importrandom,turtleast-fromrandomimportrandint,choiceasrandom_choice

Page 13: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Grammatik och lexikon för importer

import_stmt::="import"module["as"name](","module["as"name])*|"from"relative_module"import"identifier["as"name](","identifier["as"name])*|"from"relative_module"import""("identifier["as"name](","identifier["as"name])*[","]")"|"from"module"import""*"

Det finns 4 varianter -importrandom,turtleast-fromrandomimportrandint,choiceasrandom_choice-fromrandomimport(randint,choiceasrandom_choice)

Page 14: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Grammatik och lexikon för importer

import_stmt::="import"module["as"name](","module["as"name])*|"from"relative_module"import"identifier["as"name](","identifier["as"name])*|"from"relative_module"import""("identifier["as"name](","identifier["as"name])*[","]")"|"from"module"import""*"

Det finns 4 varianter -importrandom,turtleast-fromrandomimportrandint,choiceasrandom_choice-fromrandomimport(randint,choiceasrandom_choice)-fromrandomimport*

Page 15: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Klassdiagramett slags pseudokod för OOP

Page 16: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

UML: Unified Modelling Language

Klassnamn

namn:attributtypnamn:attributtyp=defaultvärde

operation()operation():returdatatypoperation(parameterlista)operation(parameterlista):returdatatyp

Page 17: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

UML, klassdiagram: relationer mellan objektObjekt kan ha någon form av relation till andra objekt

⁃ association: allmän relation. kardinalitet (antal) och roll kan anges. "Studentharläst0..*böcker"

aggregering: typ av association. "har en", "del av". "Studentäger0..*böcker"

komposition: typ av association. "består av". "Studenthar1hjärta" (starkare

beroende mellan objekten, tänk "kan inte finnas utan")

⁃ arv (basklass/härledd klass): ärver attribut/operation från (kommer mer om detta strax)

⁃ beroende: svag relation. t.ex. någon metod får in en instans som argument.

⁃ implementation: man kan använda klassdefinitioner som mallar för andra klasser. Denna association kan användas för att visa när en klass implementerar en sådan klassmall (abstrakta klasser)

Page 18: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

UML: Relationer

Yanpas. Wikimedia Commons

En dubbelriktad association kan ritas utan pilar.

Page 19: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

NinjaZombieSimulation

add_zombie(turtle:turtle.Turtle)add_ninja(turtle:turtle.Turtle)move_zombies_towards_ninjas()move_ninjas_away_from_zombies()scatter_all()run_timestep()

screen:turtle.Screenzombie_color:strninja_color:strninjas:Swarmzombies:Swarm

NinjaZombieSimulation

Page 20: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Swarm

run_swarm_behaviours()add_turtle(turtle:turtle.Turtle)keep_swarm_distance()move_away_or_towards_positions(positions:list,towards:bool=True)move_away_or_towards_position(position:turtle.Vec2D,towards:bool=True)calculate_unit_vec(vector:turtle.Vec2D):turtle.Vec2Dcalc_velocity(a_turtle:turtle.Turtle,another_turtle:turtle.Turtle):turtle.Vect2Daccelarate_turtle(turtle_index:int,accelaration:float)update_velocities()wrap_turtles()wrap_turtle(a_turtle:turtle.Turtle)scatter_turtles()get_swarm_positions():listget_swarm_center():turtle.Vec2D

friction:floataway_towards_multiplier:floatbounds:tuplemove_speed:floatpref_swarm_spacing:floatturtle_swarm:listturtle_velocities:list

Swarm

Page 21: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

turtle.Turtle, Swarm & NinjaZombieSimulation

add_zombie(turtle:turtle.Turtle)add_ninja(turtle:turtle.Turtle)move_zombies_towards_ninjas()move_ninjas_away_from_zombies()scatter_all()run_timestep()

screen:turtle.Screenzombie_color:strninja_color:strninjas:Swarmzombies:Swarm

NinjaZombieSimulation

run_swarm_behaviours()…

friction:floataway_towards_multiplier:floatbounds:tuplemove_speed:floatpref_swarm_spacing:floatturtle_swarm:listturtle_velocities:list

Swarm

2 1turtle.Turtle

10…*

Page 22: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Arv i Python

Page 23: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Hierarkiska relationer

http://www.biologycorner.com/worksheets/taxonomy_interpret.html

Page 24: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Arv / härleda klasser⁃ När en klass ärver från en annan, följer alla attribut, dvs

instansvariabler och metoder med.

⁃ Syfte: Abstraktion och kodåtervinning

Page 25: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Exempel

classDataFile(object):

def__init__(self,filepath=None): self.filepath=filepath

data=DataFile("data.txt")print(data)

__str__():str

object

filepath:str

DataFile

Page 26: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Arv i Python⁃ Alla klasser i Python har en basklass - en klass som de

bygger vidare på.

⁃ Klassen object är den mest grundläggande klassen i

Python.

⁃ Klassen object har metoder som alla andra klasser ärver som t.ex. __str__()

⁃ Om klassen DataFile bygger vidare på object, kallar man

object för basklassen för klassen DataFile(eng. base

class). DataFileär en klass, härledd (eng. derived) från

klassen object.

Page 27: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Syntax klass med arv

classBase(object):pass

classDerived(Base):pass

Page 28: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Arv i Python forts⁃ En härledd klass har alla attribut (instansvariabler och

metoder) som dess basklass har.

⁃ En härledd klass kan ges ytterligare attribut.

⁃ En härledd klass kan överrida attribut från dess basklass.

Page 29: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Arv - exempel

classAnimal(object):

def__init__(self):self.food="plants"

defrun(self):print("Irunlikethewind.")

#Härleddaklasserärverallaattributfrån#sinbasklass,dvsinstansvariableroch#metoderclassHorse(Animal):pass

>>>h=Horse()

>>>h.run()Irunlikethewind.

Page 30: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Basklass - härledd klass: med __init__classBase(object):def__init__(self,arg1):self.arg1=arg1

classDerivedA(Base):def__init__(self,arg1,arg2): #Explicitanropavbasklassens__init__()-metodBase.__init__(self,arg1)self.arg2=arg2

classDerivedB(Base):def__init__(self,arg1,arg2): #Användningavsuperförattrefereratillbasklassen #syntax:super(härledd_klass,instans_av_härledd_klass)super(DerivedB,self).__init__(arg1)self.arg2=arg2

Page 31: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

UndantagExceptions

Page 32: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

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.

Page 33: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

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.

Page 34: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Exempel på undantag i Python⁃ ZeroDivisionError

⁃ IOError

⁃ IndexError

⁃ KeyError

⁃ TypeError

Page 35: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Mönster för undandagshantering i Python

try: # här lägger man koden som kan utlösa ett undantag except [namn på 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.

Page 36: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Exempel: Fånga undantag

letters=["a","b","c","d","e","f"]

try:l_index=0whileTrue:print(letters[l_index])l_index+=1except:print("Anexceptionwasraised.")

Page 37: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Exempel: Fånga och instansiera undantag

letters=["a","b","c","d","e","f"]

try:l_index=0whileTrue:print(letters[l_index])l_index+=1exceptExceptionaserror:print("Anexceptionwasraised.")print(error)

Page 38: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Exempel: Fånga specifikt undantag

letters=["a","b","c","d","e","f"]

try:l_index=0whileTrue:print(letters[l_index])l_index+=1exceptIndexError:print("Index"+str(l_index)+"isoutofbounds.")

Page 39: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Exempel: Fånga och instansiera specifikt undantag

letters=["a","b","c","d","e","f"]

try:l_index=0whileTrue:print(letters[l_index])l_index+=1exceptIndexErrorasindex_error:print("Index"+str(l_index)+"isoutofbounds.")print(index_error)

Page 40: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

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

Page 41: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Kontroll av argument med hjälp av flera undantag

defget_dog_desc(dog_dict):try:output_string="Mynameis"+dog_dict['name']+""output_string+="andIam"+str(dog_dict['age'])+"yearsold."returnoutput_stringexceptTypeErrorastype_error:print("Argumentnotadictionary")print(type_error)exceptKeyErroraskey_error:print("Wrongkeysindictionary.")print(key_error)

Page 42: 729G06 Programmering och logik - ida.liu.se Python är p1.move_to ... Ovanstående notation är BNF (Backus Normal Form) som ofta används inom ... tuple move_speed : float

Kontroll av argument med hjälp av flera undantag som ett fall

defget_dog_desc(dog_dict):try:output_string="Mynameis"+dog_dict['name']+""output_string+="andIam"+str(dog_dict['age'])+"yearsold."returnoutput_stringexcept(TypeError,KeyError)aserror:print("Notadictionaryorkeynotpresentindictionary.")print(error)