"type object 'Question' has no attribute 'frag' " wird mir als Fehlercode angezeigt... was hab ich falsch gemacht?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Alex238
User
Beiträge: 1
Registriert: Samstag 23. März 2019, 11:47

#Das ist mein Code
from Fragen import Question

fragen_liste = [
"Welche Farbe haben Äpfel?\n(a) Rot/Grün\n(b) Blau/Gelb\n(c) Grau\n\n",
"Welche Farbe haben Bananen?\n(a) Rot\n(b) Orange\n(c) Gelb\n\n",
"Welche Farbe haben Karotten?\n(a) Blau\n(b) Orange\n(c) Violett\n\n"
]

Array = [
Question(fragen_liste[0], "a"),
Question(fragen_liste[1], "c"),
Question(fragen_liste[2], "b")
]

def test(Fra):
score = 0
for f in Fra:
antw = input(Question.frag)
if antw == Question.antwort:
score += 1
print("Du hast " + str(score) + "/" + str(len(Fra)) + "richtig")

test(Array)

#Und das ist aus der Datei "Fragen"
class Question:

def __init__(self, frag, antwort):
self.frag = frag
self.antwort = antwort


#Ich verstehe nicht so ganz, wo mein Fehler liegt. Sieht genauso aus, wie bei anderen
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte benutze die code-Tags, sonst ist dein Code nicht lesbar. Und bitte beschreibe deine Fehler konkret, unter Angabe der Fehlermeldung.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nachtrag: jetzt erst den Titel gesehen. Trotzdem bleibt der Hinweis gültig, das macht es klarer.

Und zum Fehler: du versuchst auf der KLASSSE zu arbeiten. Nicht auf einer INSTANZ von Question. Erstere ist die Blaupause. Letzteres ein konkretes Exemplar. Du musst als “f” benutzen.
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Alex238: Ausserdem sollte das `frage` heissen und nicht `frag`. Gewöhne Dir am besten gar nicht erst an überall einfach willkürlich Buchstaben wegzulassen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Alex238: Noch ein paar Anmerkungen zum Quelltext:

Die Klasse `Question` rechtfertigt kein eigenes Modul. Zudem ist das eine reine Daten”klasse”, der Typ könnte also mit `collections.namedtuple()` erstellt werden.

Konkrete Grunddatentypen haben in Namen nichts zu suchen. Das ändert sich bei der Programmentwickluch häufig und dann muss man überall die Namen anpassen die betroffen sind, oder man hat falsche, irreführende Namen im Quelltext stehen.

`Array` ist falsch. Das ist eine Liste. Es gibt in Python auch Arrays, damit sind aber meistens Numpy-Arrays gemeint. Seltener der Datentyp aus dem `array`-Modul aus der Standardbibliothek. Und im Zusammenhang mit dem `ctypes`-Modul manchmal auch die Objekte die für Arrays aus der Programmiersprache C stehen. Hat aber alles nichts mit Deinem Programm zu tun.

Zudem ist der Name viel zu generisch. Das sind ja die eigentlichen Fragen-Objekte, also könnte man diese Liste auch `fragen` nennen. Beziehungsweise `FRAGEN`, denn Konstanten werden in Python konventionell KOMPLETT_GROSS geschrieben. Klassen in MixedCase und alles andere klein_mit_unterstrichen. Siehe den Style Guide for Python Code.

Die Fragetexte sollte man nicht so von den richtigen Antworten trennen. Stell Dir mal vor das wären mehr, also beispielsweise 100, und Du müsstest das a) alles hinschreiben, und b) mal bei einem Frage/Antwort-Paar etwas ändern. Dann musst Du anfangen Zeilen abzuzählen. Das ist umständlich und fehleranfällig.

Deine Namensgebung ist bezüglich Deutsch/Englisch sehr inkonsequent. Du solltest Dich für eine Sprache entscheiden. Besser in die Programmiersprache und deren Bibliotheken würde sich Englisch integrieren.

Zeichenketten und Werte per `str()` und ``+`` zusammenstückeln ist eher BASIC als Python. Python hat dafür Zeichenkettenformatierung mit der `format()`-Methode und ab Python 3.6 f-Zeichenkettenliterale.

Code: Alles auswählen

#!/usr/bin/env python3
from collections import namedtuple

Frage = namedtuple('Frage', 'frage antwort')

FRAGEN = [
    Frage(
        'Welche Farbe haben Äpfel?\n(a) Rot/Grün\n(b) Blau/Gelb\n(c) Grau',
        'a',
    ),
    Frage(
        'Welche Farbe haben Bananen?\n(a) Rot\n(b) Orange\n(c) Gelb',
        'c',
    ),
    Frage(
        'Welche Farbe haben Karotten?\n(a) Blau\n(b) Orange\n(c) Violett',
        'b',
    ),
]


def test(fragen):
    punkte = 0
    for frage in fragen:
        antwort = input(frage.frage + '\n\n')
        if antwort == frage.antwort:
            punkte += 1
    print(f'Du hast {punkte}/{len(fragen)} richtig')


if __name__ == '__main__':
    test(FRAGEN)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten