2016-06-24 12 views
1

Ich habe eine Reihe von Python-Dateien, die ein Programm zum Speichern von Leckerbissen von Informationen und suchen sie über Tag-Zuordnung. Ich hatte das Programm für viele Versionen arbeiten, aber ich habe vor kurzem gemacht, was ich dachte, war eine geringfügige Änderung, die das Programm zu verrückt spielen verursacht. Das ENTRY-Objekt ist die Grundlage des Datenspeichers - es enthält eine eindeutige ID-Nummer, einen Kurznamen, einen Wert und eine Liste von Tags.Python 3 AttributeError obwohl Attribut existiert

class ENTRY: 

def __init__(self, idNum, nickName, value, tagList): 
    self.idNum = idNum 
    self.nickName = nickName 
    self.value = value 
    self.tagList = tagList 

Ich erkannte, dass ich austauschbar wurde dem „Spitznamen“ Attribut als „Name“, die sich, wenn für die Eingabe in anderen Dateien zu fragen, so habe ich beschlossen, auf Suchen und Ersetzen alle Erwähnungen von „nickname“ mit „name“ Machen Sie den Code einfacher zu folgen. Ich tat dies in der ENTRY.py Datei sowie alle damit verbundenen Python-Dateien im Programm. Ich habe sie sogar Korrektur gelesen, um sicher zu gehen, dass die Änderung nicht mit irgendwelchen Groß- und Kleinschreibungsaufrufen oder so etwas zu tun hat.

Das Problem: Nun, wenn ich das Programm ausführen, bekomme ich ein Attribut Fehler:

Traceback (most recent call last): 
    File "/Memory/TagMem.py", line 210, in <module> 
    main() 
    File "/Memory/TagMem.py", line 207, in main 
    dispatch(userChoice) 
    File "/Memory/TagMem.py", line 171, in dispatch 
    nameList('todo') 
    File "/Memory/TagMem.py", line 103, in nameList 
    memory.searchListNames(queryList) 
    File "/Memory/Memory.py", line 96, in searchListNames 
    each.printName() 
    File "/Memory/ENTRY.py", line 49, in printName 
    print("({}) {}".format(self.idNum, self.name)) 
AttributeError: 'ENTRY' object has no attribute 'name' 

Aber nach dem Suchen und Ersetzen, die ENTRY Objekt mit Sicherheit ein Attribut ‚name‘ hat:

class ENTRY: 

def __init__(self, idNum, name, value, tagList): 
    self.idNum = idNum 
    self.name = name 
    self.value = value 
    self.tagList = tagList 

Kennt jemand einen Grund, den ich einen Attributfehler erhalten würde, wenn das Attribut im Klassenkonstruktor sehr klar definiert ist?

Umfassendere Informationen über den gesamten Klassencode finden Sie im Github-Repository: https://github.com/kylelambert101/TagMem

und die spezifischen begeht mit der Crash auslösende Veränderungen: https://github.com/kylelambert101/TagMem/commit/68987f2e6ed98012f36ec5230b3dac6f09373489

Thank you!

+1

Stellen Sie sicher, dass Sie die Version ausführen, die Sie für richtig halten. – user2357112

+0

Es sieht so aus, als ob Sie eine benutzerdefinierte Klasse aus einer Datei in eine andere Datei importieren, die Sie ausführen, richtig? Wenn das der Fall ist, haben Sie versucht, den Python-Interpreter zu beenden und wieder hochzufahren? Änderungen an Ihren abhängigen Modulen werden nicht aktualisiert, wenn Sie sie erneut ausführen, es sei denn, Sie haben sie beendet. – Jeff

+0

Hmmm, ich habe das Programm einige Male verlassen und wieder geöffnet, also glaube ich nicht, dass das das Problem ist. Ihr Kommentar hat mich jedoch dazu gebracht, darüber nachzudenken, welche Dateien versuchen, auf ENTRY.name zuzugreifen, und ich denke, das Problem ist, dass ich die Datenbank mit einer Menge alter ENTRY-Objekte inkorporiert habe.Ich kann neue Einträge gut machen, aber wenn ich versuche, auf das Namensattribut der alten zuzugreifen, erhalte ich den Fehler. Ich werde versuchen, es zu beheben und meinen Beitrag zu aktualisieren, wenn das das Problem ist! – Kyle

Antwort

0

Ich habe herausgefunden, wo ich falsch gelaufen bin! Mein Programm ist mit einer Datei namens myMemory.dat verknüpft, die eine gebeizte Version eines Memory Objekts speichert und mit jedem Programmlauf geladen und gespeichert wird. Das Objekt Memory ist im Wesentlichen eine Liste von ENTRY, die abgefragt werden müssen. Zu der Zeit, als ich meinen gesamten Code aktualisiert hatte, um den Namen name anstelle von nickname zu verwenden, hatte ich bereits Hunderte von ENTRY Objekten in myMemory.dat gespeichert - jeweils eine Instanz des alten ENTRY Objekts mit einem nickName Attribut anstelle eines name Attributs. Als ich Funktionen anrief, die versuchten, auf das ENTRY Objekt name Attribut zuzugreifen, warf das Programm einen Fehler auf, weil die ENTRY Objekte in Frage dieses Attribut nicht hatten.

Das Update: Ich durchgeschleift das Memory Objekt in myMemory.dat gespeichert und alle Infos in neue ENTRY s in einem neuen Memory Objekt kopiert. Ich habe die neue Memory zu myMemory.dat gespeichert, und das Programm funktioniert gut wie neu!