I seminarvideoene blir det snakket om lister av lister. Disse er ogs? viktige ? ogs? se.
Stikkord
- Objektorientering
- None
- Referanser
None
- Brukes til ? representere frav?ret av en verdi.
Alts? hvis man har en variabel som refererer til et objekt og ?nsker at det ikke skal ha verdi kan man sette variablene til “None”.
Et eksempel hvor None er brukt:
(dette er en del av et st?rre program som skal programmeres senere. Her har man en liste av student-objekter og ?nsker ? se om man finner studenten med det oppgitte navnet):
def finn_stud(self, navn) :
student = None
for s in self._studentliste :
if str(s) == navn :
student = s
return student
Denne metoden vil enten returnere et objekt av typen student (dersom den finner riktig student), hvis den ikke finner den s? vil den returnere None.
Vi kan ogs? skrive om kodesnutten til:
def finn_stud(self, navn) :
for s in self._studentliste :
if str(s) == navn :
return s
Hva er forskjellen p? disse kodesnuttene?
None er ogs? default (standard) verdien som returneres fra enhver metode, med mindre noe annet er definert. Med andre ord: lager vi en metode uten returverdi, s? ser det ut som den ikke returnerer noe, men i virkeligheten returnerer den “None”.
Fra der metoden er kalt kan vi skrive:
student = finn_stud(navn)
if student is None:
print("Fant ikke studenten")
else:
#<gj?re andre ting, feks kalle p? metoder fra student-objektet>
Fors?ker vi ? gj?re feks student.skriv_info() og student er None vil programmet kr?sje.
Oppgave 1
Skriv en klasse sirkel. En sirkel har en radius, lag en konstrukt?r som setter radius.
Lag tre metoder til: en som returnerer diameteren til sirkelen, en som returnerer omkretsen til sirkelen og en som returnerer arealet til sirkelen.
Hint: omkrets av en sirkel er diameter pi, arealet av en sirkel er radius^2 pi. Eksponenter skrives som <base>**<eksponent>
, f.eks. 28 skrives 2**8.
Lag deretter 2 sirkler med ulik radius. Skriv ut den ene sirkelens omkrets og areal, og den andre sirkelens diameter.
I omkrets b?r man benytte seg av diameter()
-metoden
Datastruktur og kontrollflyt
Vi skal n? se litt mer p? datastruktur og referanser.
Referanser
En referanse er en m?te ? f? tak i objekter p?. En slags peker.
Om vi ser p? koden
hund = Dyr("hund", 23, 2.5)
er her “hund” en referanse til et objekt av typen dyr.
Pekere
Vi har i oppgave 4 fra forrige uke laget tre instanser av klassen Dyr.
hund = Dyr("hund", "hann", 10.2)
katt = Dyr("katt", "hunn", 5.7)
sau = Dyr("sau", "hann", 30.6)
Vi kan tegne opp dette med bokser og pekere:
Hva skjer om vi skriver hund = katt
?
N?r vi setter hund = katt
endrer vi pekeren hund til ? peke p? samme objekt som katt peker p?. Dette kan vi tegne opp som:
Hund er alts? ikke selve Dyre-objektet, men refererer kun til det!
Oppgave 2
Tegn datastruktur-tegninger for oppgave 1.
Oppgave 3
Lag en klasse Blomst.
En blomst har en art, en h?yde, en instansvariabel som sier om blomsten har det bra eller ikke (denne verdien er en boolean), og en verdi som forteller hvor lenge siden blomsten ble vannet sist. Konstrukt?ren setter alle disse verdiene, n?r en blomst blir opprettet vil blomsten alltid ha det bra og det vil v?re 0 dager siden den ble vannet sist.
En blomst har en metode hentStatus
som returnerer verdien som forteller om blomsten har det bra eller ikke.
I tillegg har den metoden skrivUtInfo
, som skriver ut en info streng om blomsten
Videre har en blomst en metode nesteDag
, som ?ker antall dager siden den ble vannet med en. Hvis det er mer enn tre dager siden blomsten ble vannet sist vil statusen til blomsten v?re at den har det d?rlig. Hvis statusen til blomsten er at den har det bra vokser blomsten 1 cm.
Den siste metoden en blomst har er metoden vann
. Hvis det er mindre enn 3 dager siden blomsten ble vannet vil statusen til blomsten bli d?rlig (over vanning), ellers vil statusen v?re bra.
Skriv denne klassen + lag et testprogram for ? teste klassen din