Kapitel 4
Deine ersten Klassen und Objekte
Von Frage-Dictionarys zu Frageobjekten
Das Projekt in Kapitel 3 hat vollständige Versuchs-Dictionarys mit mehreren Funktionen verarbeitet. Dieser Entwurf funktionierte, weil jeder Datensatz die Schlüssel verwendete, die diese Funktionen erwarteten.
Frage-Dictionarys folgen derselben Regel. Eine vertraute Quizfrage sieht so aus:
question = {
"prompt": "What does len('cat') return?",
"answer": "3",
}
Dieser Entwurf funktioniert. Dictionarys sind kein Fehler, und eine Klasse ist nicht automatisch besser. In diesem Kapitel untersuchen wir, was passiert, wenn ein wachsendes Programm davon abhängt, dass jedes Frage-Dictionary genau denselben Aufbau hat.
Vergleiche diese Fragen:
questions = [
{
"prompt": "What does len('cat') return?",
"answer": "3",
},
{
"text": "Which keyword starts a function?",
"answer": "def",
},
]
Das zweite Dictionary verwendet text, wo das Programm prompt erwartet. Python kann dieses Dictionary ohne Beanstandung erstellen. Das Problem erscheint später, wenn ein anderer Programmteil den fehlenden Schlüssel verwenden möchte.
Das Verhalten liegt an einer anderen Stelle
Eine Funktion kann eine Antwort prüfen:
def is_correct(question, response):
return response == question["answer"]
Die Fragedaten liegen an einer Stelle, die Regel für die Arbeit mit diesen Daten an einer anderen. Wenn das Programm wächst, kann eine Änderung am Dictionary auch Änderungen in jeder Funktion erfordern, die seine Schlüssel verwendet.
Das ist der Anlass, unseren Entwurf weiterzuentwickeln. Wir möchten eine verlässliche Art von Wert, die:
immer eine Quizfrage darstellt;
die Informationen mitführt, die eine Frage braucht;
die Operationen bereitstellt, die zu einer Frage gehören.
Die nächste Lektion stellt Pythons Möglichkeit vor, einen solchen Wert zu definieren. Prüfe zuerst, ob das Problem klar ist.
Warum verursacht das zweite Dictionary Probleme für Code, der question["prompt"] liest?
Probiere den Fehler aus
Der Editor enthält zwei Frage-Dictionarys und eine Funktion, die ihre Fragetexte anzeigt. Führe sie aus, lies die letzte Zeile der Fehlermeldung und korrigiere dann den abweichenden Schlüssel.
Korrigiere vorerst nur den abweichenden Schlüssel. Bringe zuerst den vorhandenen Entwurf wieder zum Laufen. Eine nützliche Abstraktion sollte ein Problem lösen, das du verstehst, und keines verbergen, das du noch nicht untersucht hast.
Aufgabe
Führe das Programm aus und lies die letzte Zeile des Tracebacks.
Ändere den abweichenden Schlüssel, sodass beide Fragetexte ausgegeben werden. Beantworte dann für dich diese Frage: Was musste aufeinander abgestimmt bleiben, damit das Programm funktioniert?