2016-07-30 6 views
1

Ich versuche, ein Quiz für mein Projekt zu machen, und ich bekomme diesen Fehler: AttributeError: 'module' object has no attribute 'question'. Ich verstehe nicht, warum es meine Klasse für ein Attribut hält.Das Objekt 'Modul' hat kein Attribut 'quetion'. Klassenname wird als Attribut betrachtet?

  • questionbf.py ist, wo ich die Binärdatei gemacht habe.

  • quizbf.py ist, wo ich versuche, das Quiz richtig zu machen.

  • Ich habe keine Erfahrung in Python, so dass überhaupt etwas hilfreich wäre. Vielen Dank.

    questionbf.py

    import pickle 
    class question: 
        def __init__(self,a,b,c): 
          self.q=a 
          self.an=b 
          self.o=c 
    
    f1=open("Question.DAT","wb") 
    n=input("Enter no. of Questions ") 
    for i in range(n): 
        a=raw_input("Enter Question ") 
        b=raw_input("Enter Answer ") 
        c=raw_input("Enter Options ") 
        s=question(a,b,c) 
        pickle.dump(s,f1) 
    f1.close() 
    

    quizbf.py

    import pickle 
    
    print '''Welcome to the revision quiz.''' 
    
    print 
    score=0 
    w=0 
    c=0 
    f1=open("Question.DAT","rb") 
    try: 
        while True: 
         s=pickle.load(f1) 
         print s.q 
         print s.o 
         guess=input("Enter Choice ") 
         if guess==s.a: 
          print "Correct!!" 
          print 
          score=score+1 
          c=c+1 
         elif guess=="exit" or guess=="Exit": 
          break 
         else: 
          w=w+1 
          print "Incorrect. Better luck next time!!" 
          print 
    except EOFError: 
        f1.close() 
    print s 
    print w 
    

    Fehler:

    Traceback (most recent call last): 
        File "C:\Users\RUBY\Desktop\questionbf.py", line 32, in <module> 
        s=pickle.load(f1) 
        File "C:\Python27\lib\pickle.py", line 1378, in load 
        return Unpickler(file).load() 
        File "C:\Python27\lib\pickle.py", line 858, in load 
        dispatch[key](self) 
        File "C:\Python27\lib\pickle.py", line 1069, in load_inst 
        klass = self.find_class(module, name) 
        File "C:\Python27\lib\pickle.py", line 1126, in find_class 
        klass = getattr(mod, name) 
    AttributeError: 'module' object has no attribute 'question' 
    
    +0

    Ich weiß nicht Python, aber für mich klingt das wie es kann die Objekte nicht entpacken, weil die Klasse "Frage" nicht definiert ist. – melpomene

    +0

    1) Klassen sollten in Python groß geschrieben werden. 2) Haben Sie versucht, eine Frage zu importieren? Mit anderen Worten, Sie müssen die 'question'-Klasse importieren, damit das Modul davon erfährt. –

    +0

    @ cricket_007 Sie müssen möglicherweise eine separate' question.py'-Datei erstellen, die nur die Klassendefinition enthält (die Sie dann importieren) in beiden Skripten). Wenn nicht, vermute ich, dass Python das gesamte 'questionbf'-Skript erneut ausführen wird. – melpomene

    Antwort

    1

    Wenn Pickles Sie in Stand einer Klasse Der Klassenname wird in der Beize gespeichert, damit das Leseprogramm das erforderliche Modul importieren und Zugriff auf die erforderliche Klasse erhalten kann. Leider ist die Klasse, deren Elemente Sie beizen, im Modul __main__, was der Name ist, den Python dem Modul gibt, das gerade ausgeführt wird.

    Wenn Ihr zweites Programm die Gurke liest, sucht es nach der Klasse question im Modul __main__, das dieses Mal das zweite Programm ist. So beschwert sich pickle, dass die angegebene Klasse (__main__) die erforderliche Klasse nicht enthält (eine definierte Klasse ist ein Attribut ihres Moduls genau wie eine Methode einer Klasse ein Attribut der Klasse).

    Die einfachste Lösung ist, die question Klasse in ein separates Modul zu verschieben, das Ihr erstes Programm explizit importiert (etwa from new_module import question). Ihr zweites Programm wird dann wissen, dass es new_module importieren muss, um auf die Klasse question zugreifen zu können, was automatisch erfolgt (, d. H., ohne dass es explizit importiert werden muss).

    Eine andere Möglichkeit (von @Doogle in einem Kommentar unten vorgeschlagen) besteht darin, die Klasse question in den Namespace Ihres Hauptprogramms zu importieren, bevor Sie das Auspacken versuchen.

    +1

    Einfach fantastisch. Nie das Problem Kratzen Kopf für über 1,5 Stunden. Große Antwort.Um hinzuzufügen, kann das Problem gelöst werden, wenn die Klasse in das __main__ des Python-Moduls importiert wird, in dem das Unpicken aufgerufen wird. Das hat wirklich geholfen. – Doogle

    +0

    Guter Punkt - bemerkte ein paar Tyops, also habe ich Ihren Vorschlag als Bearbeitung eingefügt - danke! – holdenweb

    Verwandte Themen