2012-02-16 16 views
0

私は、テキストファイルを実行して単語をリストにスライスしてクラスインスタンスを作成していますが、私は分割点として空白を使用しています。オブジェクトが作成されたとは限りませんが、オブジェクトにアクセスできませんか?

このコードを使用して、配列の名前に基づいてクラスのオブジェクトを作成します。

初期化時にオブジェクトが印刷されるため、オブジェクトが作成されていることがわかります。

blue.getWordName()  
NameError: global name 'blue' is not defined 

私は本当に混乱していますと回答を検索を試してみましたが、私は正しい用語を使用していますかわからない:

私の問題は、私は私が得るこれらのオブジェクトにアクセスしようということです。

私は目標を達成するために辞書を使うことができると考えましたが、実際にはクラスインスタンスをもっと理解したいと思っています。

リストアイテムからオンザフライでクラスを作成することに法律はありますか?

私は、コードのすべてを含めるようにしようとしましたが、それは私が私が私が最も関連性の高いと思われるものが含まだろうことはできないだろう:

class Word(): 
def __init__(self, name): 
    print 'You have just created me and I\'m called ' + name 
    self.name = name 


if count > 0 and wordArray[count - 1] == 'is': 
     title = wordArray[count] 
     if title not in checkKeyWords(): 
      exec("%s = Word(title)" % (title)) #set class from list item. 


      if word in verbArray: 
       exec("%s.setWordType('verb')" % (title)) 

は最終的に私が作成した以下の関数を呼び出すと、正確に綴られていますが、私はまた、 '青'が間違いなくリストに入っていることを確認しました。

blue.getWordName() 
+3

"リスト項目からその場でクラスを作成することに違反する法律はありますか?" - いいえ、生命を脅かす状況を除いて、「exec」の使用に関する法律が存在する必要があります。クラスとインスタンスについて知りたければ、 'exec'の使用を控えてください。そうしないと、代わりにそのクォークを学習するだけです。 –

答えて

0

私は、私は完全に別の答えに同意することを言って使用を始めましょう代わりに辞書。問題への回答を希望する場合は、例を再現可能にしてください。あなたのコードの少し適応バージョン:

class Word(): 
    def __init__(self, name): 
    print 'You have just created me and I\'m called ' + name 
    self.name = name 
    self.wordType = None 
    def setWordType(self, type_string): 
    print "Hey, and the method works!" 
    self.wordType = type_string 

wordArray = ["spam","ni", "is","blue"] 
count = 3 
if count > 0 and wordArray[count - 1] == 'is': 
    title = wordArray[count] 
    exec("%s = Word(title)" % (title)) #set class from list item. 
    exec("%s.setWordType('verb')" % (title)) 

作品罰金:

> python bla.py 
You have just created me and I'm called blue 
Hey, and the method works! 

それはあなたがあなたのインデントを台無しにしていることかもしれません。キーワードリスト(if title not in checkKeyWords())のタイトルがnoであることを確認し、それが保持されている場合にのみオブジェクトを作成します。 blueオブジェクトをコードのどこかで参照していても、作成されていない可能性があります。しかし、実例がなければ、これを伝えることは不可能です。

+0

そうですね、コード全体が必要なのではないかと気づきました。私の将来のコードをすべて実行可能にすることを忘れないでください。私はまだ関数にアクセスすることはできませんので、コードを詳しく見ていきます。ご協力いただきありがとうございます! – bisonpowers

+0

多分私の例を編集してエラーを再現することができます –

+0

大丈夫両方のソリューションが私を助けてくれました。それは本当に物事の組み合わせだったが、私はそこに着いたことを助ける、たくさんありがとう! – bisonpowers

6

これを行わないでください。 exec非常にこれを解決する悪いツールです。これを行うにはもっと良い方法は、例えば次のとおりです。

words = {} 

if count > 0 and wordArray[count - 1] == 'is': 
     title = wordArray[count] 
     if title not in checkKeyWords(): 
      words[title] = Word(title) 

      if word in verbArray: 
       words[title].setWordType('verb') 

その後、あなたはこのようなあなたの最終チェックを行うだろう:

words["blue"].getWordName() 
+1

何らかの理由でローカル変数を絶​​対に使用する必要がある場合は、 '' vars()[title] = Word(title) ''を実行できます - しかし、私は同意します。 –

+0

私は本当にあなたの迅速な応答に感謝し、それはずっと清潔な方法です、私はまだこのメッセージを厳しい得る:青。NameError:name 'blue'が定義されていません – bisonpowers

+0

@bisonpower:正しいですが、 'words [" blue "] .name()'を使用してください。 – orlp

関連する問題