6. Exempel

Programmeringsteknik

Hoppa till: navigering, sök
       Teori          Övningar          Exempel1          Exempel2          Inlämningsuppgift 3: Nöjesfält      

Vi har följande klass, som håller reda på hur många kakor som en viss person har ätit. Eftersom det inte finns oändligt många kakor att äta, så definieras klassvariabeln kakburk

class Kakmonster:
    'Håller reda på hur många kakor som en person har ätit'
    kakburk = 0
    def __init__(self, namn):
        self.namn = namn
        self.ätna_kakor = 0

    def __str__(self):
        return self.namn + ' har ätit ' + str(self.ätna_kakor) + ' kakor.'

    def ät_kaka(self):
        self.ätna_kakor +=1
        Kakmonster.kakburk -= 1

För att skapa en instans av klassen Kakmonster, så behöver vi ange namnet på kakmonstret. Vi fyller även på kakburken.

namn = input("Hej, vad heter du? ")
Kakmonster.kakburk = 3

Betrakta lösningen nedan och försök att se vad som är fel.

while Kakmonster.kakburk != 0:
    svar = input("Vill du äta en kaka? ")
    person = Kakmonster(namn)
    if svar.lower().startswith('j'):
        person.ät_kaka()
    print(person)
    print("Kvar i kakburken: ", Kakmonster.kakburk)

Ifall vi testkör programmet, så får vi följande:

Hej, vad heter du? August
Vill du äta en kaka? Ja
August har ätit 1 kakor.
Kvar i kakburken:  2
Vill du äta en kaka? Ja
August har ätit 1 kakor.
Kvar i kakburken:  1
Vill du äta en kaka? Nej
August har ätit 0 kakor.
Kvar i kakburken:  1
Vill du äta en kaka? Ja
August har ätit 1 kakor.
Kvar i kakburken:  0

Ser du felet nu? Antalet kakor i kakburken minskar, men inte hur många kakor som August har ätit.

Anledningen är att vi har placerat instansieringen av objektet inuti loopen, så för varje gång som vi tar en ny loop så skapas en ny instans. Vi vill ju enbart ha ett enda objekt, så vi måste skapa det utanför loopen och enbart anropa det i:

class Kakmonster:
    'Håller reda på hur många kakor som har ätits'
    kakburk = 0
    def __init__(self, namn):
        self.namn = namn
        self.ätna_kakor = 0

    def __str__(self):
        return self.namn + ' har ätit ' + str(self.ätna_kakor) + ' kakor.'

    def ät_kaka(self):
        self.ätna_kakor +=1
        Kakmonster.kakburk -= 1

Kakmonster.kakburk = 3

namn = input("Hej, vad heter du? ")
person = Kakmonster(namn)

while Kakmonster.kakburk != 0:
    svar = input("Vill du äta en kaka? ")
    if svar.lower().startswith('j'):
        person.ät_kaka()
    print(person)
    print("Kvar i kakburken: ", Kakmonster.kakburk)

print('Nu är kakburken tom!')

Nu ser även output korrekt ut:

Hej, vad heter du? August
Vill du äta en kaka? Ja
August har ätit 1 kakor.
Kvar i kakburken:  2
Vill du äta en kaka? Nej
August har ätit 1 kakor.
Kvar i kakburken:  2
Vill du äta en kaka? Ja
August har ätit 2 kakor.
Kvar i kakburken:  1
Vill du äta en kaka? Ja
August har ätit 3 kakor.
Kvar i kakburken:  0


Klassvariabeln kakburk gör att vi kan skapa flera instanser av Kakmonster, som alla delar kakburks värde. Så låt oss skapa flera kakmonster:

import random

class Kakmonster:
    'Håller reda på hur många kakor som har ätits'
    kakburk = 0
    def __init__(self, namn):
        self.namn = namn
        self.ätna_kakor = 0

    def __str__(self):
        return self.namn + ' har ätit ' + str(self.ätna_kakor) + ' kakor.'

    def ät_kaka(self):
        self.ätna_kakor +=1
        Kakmonster.kakburk -= 1
        
Kakmonster.kakburk = 3
kakLista = [Kakmonster('August'), Kakmonster('Algot'),
            Kakmonster('Maj'), Kakmonster('Birgit')]

while Kakmonster.kakburk != 0:
    slump = random.randint(0,len(kakLista)-1)
    kakLista[slump].ät_kaka()
    print(kakLista[slump])
    print("Kvar i kakburken: ", Kakmonster.kakburk)
print('Nu är kakburken tom!\n\nSå här många kakor åt alla:\n')
for kakmonster in kakLista:
    print(kakmonster)

Så här kan output se ut:

Algot har ätit 1 kakor.
Kvar i kakburken:  2
Maj har ätit 1 kakor.
Kvar i kakburken:  1
Algot har ätit 2 kakor.
Kvar i kakburken:  0
Nu är kakburken tom!

Så här många kakor åt alla:

August har ätit 0 kakor.
Algot har ätit 2 kakor.
Maj har ätit 1 kakor.
Birgit har ätit 0 kakor.