Upload
phunghanh
View
224
Download
4
Embed Size (px)
Citation preview
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)