6. Exempel

Programmeringsteknik

(Skillnad mellan versioner)
Hoppa till: navigering, sök
(Ny sida: 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 <code>kakb...)
Rad 27: Rad 27:
if svar.lower().startswith('j'):
if svar.lower().startswith('j'):
person.ät_kaka()
person.ät_kaka()
-
print(person)
+
print(person)
print("Kvar i kakburken: ", Kakmonster.kakburk)</pre>
print("Kvar i kakburken: ", Kakmonster.kakburk)</pre>
Rad 40: Rad 40:
Kvar i kakburken: 1
Kvar i kakburken: 1
Vill du äta en kaka? Nej
Vill du äta en kaka? Nej
 +
August har ätit 0 kakor.
Kvar i kakburken: 1
Kvar i kakburken: 1
Vill du äta en kaka? Ja
Vill du äta en kaka? Ja
Rad 70: Rad 71:
if svar.lower().startswith('j'):
if svar.lower().startswith('j'):
person.ät_kaka()
person.ät_kaka()
-
print(person)
+
print(person)
print("Kvar i kakburken: ", Kakmonster.kakburk)
print("Kvar i kakburken: ", Kakmonster.kakburk)
Rad 82: Rad 83:
Kvar i kakburken: 2
Kvar i kakburken: 2
Vill du äta en kaka? Nej
Vill du äta en kaka? Nej
 +
August har ätit 1 kakor.
Kvar i kakburken: 2
Kvar i kakburken: 2
Vill du äta en kaka? Ja
Vill du äta en kaka? Ja

Versionen från 18 april 2012 kl. 14.15

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