729g06 programmering och logik - ida.liu.se python är p1.move_to ... ovanstående notation är bnf...

Post on 22-Mar-2018

224 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

729G06 Programmering och logikOOP: Klassdiagram, arv

Allmänt: Undantagshantering

Upplägg av Python-delen

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.

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

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

objekt kallas också för instanser

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

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

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")

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

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.

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

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

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)

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*

Klassdiagramett slags pseudokod för OOP

UML: Unified Modelling Language

Klassnamn

namn:attributtypnamn:attributtyp=defaultvärde

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

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)

UML: Relationer

Yanpas. Wikimedia Commons

En dubbelriktad association kan ritas utan pilar.

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

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

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…*

Arv i Python

Hierarkiska relationer

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

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

Exempel

classDataFile(object):

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

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

__str__():str

object

filepath:str

DataFile

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.

Syntax klass med arv

classBase(object):pass

classDerived(Base):pass

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.

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.

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

UndantagExceptions

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 [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.

Exempel: Fånga undantag

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

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

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)

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.")

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)

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

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)

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)

top related