6. Exempel

Programmeringsteknik

Version från den 18 april 2012 kl. 14.15; Msvedi (Diskussion | bidrag)
Hoppa till: navigering, sök

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; 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 innan loopen:

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