2016-06-24 11 views
1

私は、情報の宝庫を保存し、タグの関連付けによってそれらを検索するためのプログラムを構成する一連のpythonファイルを持っています。私はこのプログラムを多くのバージョンで動作させていましたが、最近私は、プログラムがひどく変わったようなマイナーな変更だと思ったものを作りました。 ENTRYオブジェクトは、固有のID番号、ニックネーム、値、およびタグのリストを保持するデータストレージの基礎です。私は他のファイルに入力を求めたときに、私は、交換可能に、「名前」と「ニックネーム」属性に言及していたので、私はすべてが「名前」と「ニックネーム」の言及検索と置換することを決めたに気づい属性が存在するにもかかわらず、Python 3 AttributeError

class ENTRY: 

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

コードを簡単にフォローしてください。私はENTRY.pyファイルと、プログラム内のすべての関連するpythonファイルでこれを行いました。私は、大文字と小文字を区別する関数呼び出しなどで変更が混乱していないことを確認するためにそれらを校正することさえできます。

問題:私は、プログラムを実行すると、私は属性のエラーを取得:

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' 

しかし、検索と置換した後に、ENTRYオブジェクトは、最も確かに属性「名前」を持っています

class ENTRY: 

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

属性が非常に明確にクラスコンストラクタで定義されている場合、属性エラーが発生する理由を知っている人はいますか?完全なクラスコードの詳細な情報については

、githubのリポジトリを参照してください。https://github.com/kylelambert101/TagMem

と特定のクラッシュを誘発変化にコミット: https://github.com/kylelambert101/TagMem/commit/68987f2e6ed98012f36ec5230b3dac6f09373489

ありがとうございました!

+1

あなたが考えているバージョンを実行していることを確認してください。 – user2357112

+0

あなたが実行している別のファイルに、あるファイルからユーザ作成のクラスをインポートしているようですね。その場合、Pythonインタプリタを終了してバックアップを開始しようとしましたか?依存モジュールの変更は、終了しない限り再実行しても更新されません。 – Jeff

+0

ええと、私は数回終了してプログラムを再開したので、それは問題だとは思わない。しかし、あなたのコメントは、どのファイルがENTRY.nameにアクセスしようとしているのか考えさせました。問題は、古いENTRYオブジェクトが入っているデータベースをピックしたことです。私は新しいエントリを作成することはできますが、古いもののname属性にアクセスしようとすると、エラーが発生します。私はそれを修正しようとし、それが問題なら私のポストを更新します! – Kyle

答えて

0

どこが間違っているのか分かりました。私のプログラムはmyMemory.datというファイルに関連付けられていて、Memoryオブジェクトの節約バージョンを保存し、プログラムの実行ごとに読み込まれて保存されます。 Memoryオブジェクトは、本質的に照会されるENTRYのリストです。私がすべてnameの代わりにという名前を使用するようにすべてのコードを更新した時点で、属性の代わりにnickName属性を持つ古いENTRYオブジェクトのインスタンスがそれぞれmyMemory.datに保存されていました。 ENTRYオブジェクトのname属性にアクセスしようとした関数を呼び出すと、問題のオブジェクトがその属性を持たないため、プログラムはエラーを投げました。

修正:私はmyMemory.datに保存されているMemoryオブジェクトを介してループし、新しいMemoryオブジェクトに新しいENTRY Sへの情報のすべてをコピーしました。新しいMemorymyMemory.datに保存しました。プログラムは新しいものとしてうまくいきます!

関連する問題