2012-03-15 4 views
1

私はクラスをセットアップし、1つのifステートメントで変数を受け入れて、それを出力します。クラスはPythonでグローバルではないようです

class npc: #class for creating mooks 
    def __init__(self, name): 
     self.name = name 
    def npc_iq (self,iq): 
     self.iq = [] 
    def npc_pp (self,pp): 
     self.pp = [] 
    def npc_melee (self, melee): 
     self.melee = [] 
    def npc_ct (self, ct): 
     self.ct = [] 

声明

if menu_option == 1: 
    print "Choose melees for npc" 
    init_bonus = random.randint(0,2) 
    char_PP = random.randint(7,15) 
    char_iq = random.randint(7,15) 
    npc_Melees = int(raw_input(prompt)) 
    combat_time = math.floor((round_attacks - init_bonus - math.floor(char_PP/2) - math.floor(char_iq/2))/npc_Melees) 
    #function for calculating sequence number 
    print "combat time is" 
    print combat_time 
    mook = "mook%s" % counter # adds different mook names to program 
    mook = npc(mook) 
    mook.iq = (char_iq) 
    mook.pp = (char_PP) 
    mook.melee = (npc_Melees) 
    mook.ct = (combat_time) 
    counter += 1 

場合には、この中で正常に動作します。しかし、この文で、それはクラスではなく、CTで名前を印刷します。ていない場合場合

elif menu_option ==4: 
    print "Printing out all mooks" 
    print 
    printcount = counter -1 
    while printcount != 0: 
     mookprint = "mook%s" % printcount 
     mookprint = npc(mookprint) 
     print mookprint.name 
     print mookprint.ct 
     print 
     printcount -= 1 
+2

'name'を出力した場合、' mookprint'は 'None'ではありません。あなたは実際に 'ct'が実際に値を持っていると確信していますか? –

+0

最初のifループでctの値が正常に出力されます。私はAttributeErrorのエラーを取得します。他の行を実行すると、npcインスタンスには属性 'ct'がありません。 – user1267762

+4

あなたはクラスの仕組みについていくつかの誤解があるようです。たとえば、オブジェクトのctメンバを設定することなく、moodprint.ctを出力しています。 –

答えて

0

を設定していなかったので、もし私は本当にあなたの問題を理解しない、実行されます。

あなたの作業例:

mook = npc(mook) 
mook.iq = (char_iq) 
mook.pp = (char_PP) 
mook.melee = (npc_Melees) 
mook.ct = (combat_time) 

mook.ctは(combat_time)の値である

あなたの失敗例:それが設定されることはありませんので

mookprint = npc(mookprint) 
print mookprint.name 
print mookprint.ct 

mookprint.ctの値が何もありません。

+0

パーフェクト!私はクラスからの情報が実際にはなかったという事実を全く知らなかった。 – user1267762

+0

それは問題でしたか?解決策として私の答えをマークしてください;)または私は完全に間違っていますか? –

+0

誰もがこれに関して多くの助けをしてくれました。騒ぎに感謝してくれてありがとう。 – user1267762

0

elifのは唯一のelifブロックを実行すると、CTは

3

なぜmookprintはctがどんな値になるべきか考えているのですか? npcのコンストラクタは、npcの新しいインスタンスを初期化します。名前はパラメータとして与えられますが、ctは空のままです。

メニューオプション1でNPCを作成すると、npcのグローバルインスタンスは作成されません。以前に作成したnpcのインスタンスを参照したい場合は、それらを保存する方法を見つける必要があります。辞書はあなたのための良い解決策かもしれません。辞書とは、キーと値の間のマッピングを保持するオブジェクトです。あなたが鍵を知っているなら、あなたは妥協した価値を見つけることができます。この場合、キーに名前を付け、npcインスタンスに値を設定します。

例えば、

npcsDict = dict() 

if menu_option == 1: 

    # code for intialising a new instance of npc 
    ... 
    # most, if not all of the initialisation code should be moved to the 
    # __init__ method for npc 

    # now store the newly created mook 
    npcsDict[mook.name] = mook 

elif menu_option == 4: 

    print "Printing out all mooks" 
    print 
    for mookName in npcsDict: 
     print npcsDict[mookName].name 
     print npcsDict[mookName].ct 
     print 
+1

ありがとうございます、これは私が最初にやろうとしていたようです。 – user1267762

+0

+1:あなたのデザインのヒントのために:) –

0

私はあなたが4行がどのように働くかを理解しているとは思わない:

mookprint = "mook%s" % printcount 
mookprint = npc(mookprint) 
print mookprint.name 
print mookprint.ct 

コードのこのブロックが実行されるたびに、次のものがhappendingされています

  1. ます変数mookprintの形式の文字列を割り当てます
  2. の新しいinstanceを作成していますclass。作成しているインスタンスはすべて別々になることに注意してください。この新しいインスタンスには、以前に変数に保持されていた名前の属性があり、このインスタンスのnpcmookprintに割り当てられます。
  3. 前の手順で作成したnpcクラスのインスタンスname属性を印刷しています。これは、このインスタンスが作成されたときに、nameが「mook1」に設定されているか、その時点でmookprintに格納されていたものを使用して、クラスの__init__メソッドが呼び出されたためです。
  4. 先ほど作成したnpcクラスのインスタンスct属性を印刷しています。 ct属性を設定していないので、これは期待どおりに動作しません。

npcクラスのインスタンスの数をカウントする場合は、class attributeを作成する必要があります。これは、値がクラスのすべてのインスタンスで共通の変数です。これを行うには、クラスの新しいインスタンスを作成するたびに、この属性にアイテムを追加するためにクラス定義を変更する必要があります。それはこのようなものになります。

class npc: #class for creating mooks 
    ct = [] 
    def __init__(self, name): 
     self.name = name 
     self.ct.append(name) 

    def get_ct(self): 
     return len(self.ct) 

上記では、変数ctnpcのすべてのインスタンスに共通であり、新しいnpcが作成されるたびに成長するリストになります。次に、方法get_ctは、このリストの期間をカウントします。私は上記のコードは、あなたはそれが動作するように期待される方法の詳細を動作するようにコードを変更する方法を示して考える

mookprint = "mook%s" % printcount 
mookprint = npc(mookprint) 
print mookprint.name 
print mookprint.get_ct() 

次に、あなたは私が見えるように述べた4本のラインを変更する必要があります。ただし、各インスタンスが他のインスタンスに関する情報に依存するクラスを作成することはめったにありません。提案された砂丘のようなものを実行したり、辞書にインスタンスを格納したり、他のデータ構造を保存したり、そのように追跡することは、通常はより良い設計です。

関連する問題