AttributeError: 'int' object has no attribute...

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
fredi
User
Beiträge: 1
Registriert: Samstag 19. Dezember 2015, 22:48

Hallo liebe Python-Freunde,

Erstmal sorry falls es schon ähnliche Beiträge über das Thema in diesem Forum geben sollte,
aber ich habe weder mit der Suchfunktion noch mit Google eine Antwort gefunden
welche mir bei der Lösung meines Problems weiterhilft...
Mein Ziel ist es durch das Problem auch etwas zu lernen, da mir hier bestimmt jemand
durch eine logische Erklärung hilft den Fehler zu verstehen um ihn in Zukunft zu vermeiden.

Da ich im Umgang mit Python noch nicht sehr viel Erfahrung habe, versuche ich momentan ein simples Mathespiel zu schreiben
um meine Programmierfähigkeiten in Python zu verbessern.


Zum Spielablauf:


Mein Spiel fragt am Anfang nach dem Namen des Spielers welcher durch (m)ein Modul namens name.py abgefragt
und in Form eines Strings zurück ins Spiel (in meinem Fall spiel_main.py) geliefert wird.
Dies klappt auch ohne Probleme.

Danach fragt es den Spieler ob er bereit sei für eine Tutorialaufgabe. Wenn man verneint und diese überspringt
gelangt man ohne Fehler zum Ende des Skriptes.


Zu meinem Problem:


Wenn man bestätigt man sei bereit sollte das von mir erstellte und ebenfalls separat liegende Modul namens tut.py,
welches die Tutorialaufgabe enthält, ausgeführt werden und ebenfalls einen Wert zurück liefern.
(Ähnlich wie es am Anfang des Skriptes mit dem Modul name.py schon einwandfrei funktioniert hat.)

Allerdings ergibt sich dann folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "/Users/fredi/Documents/spiel_main.py", line 47, in <module>
    tut = tut.tut() # <--- Tutorial starten
AttributeError: 'int' object has no attribute 'tut'
Das Modul tut.py sieht Folgendermassen aus:

Code: Alles auswählen

#Tutorial Aufgabe

import random
random.seed()


def tut():
    a = random.randint(1,1000)
    b = random.randint(1,1000)
    c = a + b
    
    print()
    print("Bestimme den Wert von 'x'")
    print()
    print(a, "+", b, "= x")

    for i in range(3, 0, -1):
        x = int(input("x = "))
        print()
        if x == c:
            print(x, "ist korrekt!")
            print()
            if i == 3:
                print("WOW! Du hast es beim ersten Versuch geschafft!",
                      "Hervorragend, weiter so!")
            if i == 2:
                print("Gut, du hast es beim zweiten Versuch geschafft!",
                      "Gar nicht schlecht!")
            if i == 1:
                print("Phuu! Beim letzten Versuch doch noch geschafft!",
                      "Nochmal gut gegangen...")
            print()
            break
        elif i > 1 and x != c:
            print(x, "ist leider Falsch, Du kannst es noch", i - 1, "mal versuchen!")
            print()

    if x != c:
        print(x, "ist leider auch Falsch...")
        print(c, "wäre die richtige Antwort gewesen...")
        print("Du hast verkackt..! -.-' ")
        print()
        tut = 2
        return tut
    else:
        tut = 1
        return tut
Komischerweise funktioniert das Modul wenn ich es selbst starte und gibt am Ende auch den richtigen Wert zurück.
Aber wenn ich es durch das Spielskript versuche kommt es wieder zum oben genannte Fehler.

Was bedeutet das nun, dass das Objekt Int kein Attribut namens tut beinhalten soll?
Beim Modul name hat es ja auch geklappt und da mache ich ja im Grunde das selbe,
nur dass bei name ein String und bei tut ein Integer zurückgeliefert werden soll... :K

Ich habe, wie ich glaube, bei beiden Modulen etwa das gleiche gemacht und sie auf die selbe art aufgerufen.
name = name.name() und tut = tut.tut()

Ich bin echt ratlos und freue mich schon auf Lösungsvorschläge.

Falls es hilft kann ich ja auf Anfrage noch den Code der spiel_main.py und name.py Dateien posten.


Liebe grüsse Fredi
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@fredi: das Problem ist in spiel_main.py. Dort bindest Du nämlich den Variablennamen tut an eine Zahl. Und zwar schon bevor Du das in tut = tut.tut() nochmal versuchst.
BlackJack

@fredi: Jeder Name kann zu einem gegebenen Zeitpunkt nur an ein Objekt gebunden sein. Wenn Du also ein Modul an den Namen `tut` bindest, zum Beispiel über einen ``import`` und dann im weiteren Verlauf eine ganze Zahl an den Namen bindest, dann ist natürlich das Modul nicht mehr an den Namen gebunden. Und während Dein `tut`-Modul ein `tut`-Attribut hat (die Funktion in dem Modul) hat eine ganze Zahl (Datentyp `int`) so ein Attribut nicht. Genau das sagt Dir die Fehlermeldung. Nenne halt nicht so viele Dinge `tut`. Ist sowieso kein guter Name. Der geht vielleicht noch für das Modul wenn man ihn ausschreiben würde (`tutorial`), aber nicht für Funktionen oder deren Rückgabewerte, ausser es handelt sich bei dem Rückgabewert um ein Tutorial, was auf eine ganze Zahl wohl eher nicht zutrifft. Funktionen werden üblicherweise nach der Tätigkeit benannt die sie durchführen.
Antworten