0%

Vererbung und Polymorphie · Übung

Optionale Fähigkeiten von Objekten verwenden

Ein Protokoll legt fest, was jedes Objekt anbieten muss. Manchmal kann ein Objekt zusätzlich etwas anbieten, ohne daraus eine Anforderung an alle zu machen.

Eine Auswahlfrage kann ihre Antwort erklären. Bei einer Umfragefrage gibt es womöglich nichts Sinnvolles zu erklären.

Nach einer vorhandenen Fähigkeit fragen

Pythons hasattr(object, name) meldet, ob ein Attribut oder eine Methode verfügbar ist:

Try it

Ein Bericht kann die Fähigkeit verwenden, wenn sie vorhanden ist:

if hasattr(item, "explain"):
    lines.append(item.explain())

Er fragt weiterhin nicht, ob das Objekt ein ChoiceQuestion ist. Ein künftiger Typ kann explain anbieten und wird automatisch genauso behandelt.

Warum nach explain suchen statt nach ChoiceQuestion?

Den Kernvertrag klein halten

Optionale Fähigkeiten sind nur auf Grundlage eines soliden Pflichtprotokolls nützlich. Wäre is_correct optional, könnte der Bericht seine Hauptaufgabe nicht erfüllen.

Verwende diese Unterscheidung:

  • Erforderliches Verhalten macht das Objekt überhaupt verwendbar.

  • Optionales Verhalten bereichert eine bestimmte Verwendung, wenn es verfügbar ist.

Verteile nicht überall hasattr, um einen klaren Vertrag zu vermeiden. Verwende es für tatsächlich optionale Ergänzungen, deren Fehlen eine klare, gewöhnliche Bedeutung hat.

Die Übung beginnt mit dem funktionierenden Bericht auf Grundlage von Duck Typing und ergänzt eine optionale Erklärung, ohne eine konkrete Klasse zu nennen.

Aufgabe

Gib ChoiceQuestion eine Methode explain(), die seine Begründung zurückgibt.

Passe report(items, responses) so an, dass die Erklärung eines Elements auf einer eigenen Zeile direkt nach dessen Ergebnis erscheint, genau dann, wenn das Objekt explain anbietet.

Verwende hasattr und prüfe nicht auf eine konkrete Klasse. Das Pflichtprotokoll aus prompt, points und is_correct bleibt unverändert.