2016-03-20 8 views
2

私はPythonを学んでおり、文字のホットゾーンに基づいて創傷システムを作成しようとしています。ここに私が書いたことがあります。あまりにも私を判断しないでください。私はskin_cut入力のために期待するPython:クラスメソッド内の変数

class Character: 
    def __init__ (self, agility, strength, coordination): 
      self.max_agility = 100 
      self.max_strength = 100 
      self.max_coordination = 100 
      self.agility = agility 
      self.strength = strength 
      self.coordination = coordination 

    def hit (self, hit_region, wound): 
      self.hit_region = hit_region 
      self.wound = wound 

      #Hit Zones 
      l_arm=[] 
      r_arm=[] 
      l_leg=[] 
      r_leg=[] 
      hit_region_list = [l_arm , r_arm, l_leg, r_leg] 


      #Wound Pretty Names 
      healthy = "Healthy" 
      skin_cut = "Skin Cut" 
      muscle_cut = "Muscle Cut" 
      bone_cut = "Exposed Bone" 

      hit_region.append(wound)    

john = Character(34, 33, 33) 

john.hit(l_arm, skin_cut) 

は「スキンカット」として認識されるように、その後、私はリストとして定義され、l_armに追加されました。しかし、私は常に名前のエラーを取得します(l_armは定義されていません)。私が最初の引数として 'wound'を使ってメソッドを書き直すと、Name Errorに定義されていない 'wound'が現れます。そのようなことは、私が逃したクラスの構造に何かがあると言いますが、私は何が分からないのですか。

+0

ローカル変数。 l_armは、関数の実行が終了すると破棄されます。 – 7stud

+0

エラーを提示してください。 – Nilesh

+0

@Lafada、明らかです! – 7stud

答えて

1

これに私の以前の答えが変わります。

class Character: 
def __init__ (self, agility, strength, coordination): 
     self.max_agility = 100 
     self.max_strength = 100 
     self.max_coordination = 100 
     self.agility = agility 
     self.strength = strength 
     self.coordination = coordination 
     self.l_arm=[] 
     self.r_arm=[] 
     self.l_leg=[] 
     self.r_leg=[] 
     self.hit_region_list = [self.l_arm , self.r_arm, self.l_leg, self.r_leg] 
     self.healthy = "Healthy" 
     self.skin_cut = "Skin Cut" 
     self.muscle_cut = "Muscle Cut" 
     self.bone_cut = "Exposed Bone" 

def hit (self, hit_region, wound): 
     self.hit_region = hit_region 
     self.wound = wound 
     hit_region.append(wound) 
     #Hit Zones 



     #Wound Pretty Names 




john = Character(34, 33, 33) 

john.hit(john.l_arm,john.skin_cut) 

print john.hit_region 
print john.l_arm 

上記のコードを実行した後、私は、この出力ポストを1として

output: 
['Skin Cut'] 
['Skin Cut'] 

を持って、私はこれがあなたが望んだと思います。あなたの前のコードによれば、宣言は関数内でのみアクセス可能でした。これで、コンストラクタ内で宣言することで、特定のインスタンスのデータとこれらの変数を操作できます。

+0

それだけではありません。コードをもう一度見てください。 – idjaw

+1

ご意見ありがとうございます。私の悪い。私は自分の答えを更新しました。 – denis

+0

np。インデントを修正して、そのコード変更をなぜ提供しているのかを少し説明してください。あなたが提供しているコードがなぜ問題を解決するのかについての文脈が増えるほど良いでしょう。ほんの一部のフレンドリーアドバイス。:) – idjaw

0

関数内に割り当てられたすべてのローカル変数は、関数が終了するとすぐに破棄されます。これらの名前の前にself.を追加して、self.l_arm,self.r_armなどのインスタンス変数として保存する必要があります。後でそれらのオブジェクトを使うことを計画しているならば、傷つきやすい名のために同じことが起こります。

+0

私はそうではありませんでした....しかし、OPの問題を解決するにはもう少し問題があると思います。彼らは 'ヒット'メソッド内で作成された変数を割り当てることで 'ヒット'メソッドを呼び出そうとしています。だから、それらの属性は実際にはそのメソッドを呼び出す前に利用可能である必要があります。おそらく彼らのinitにもおそらく.. – idjaw

1

l_armを関数内に定義し、その関数にのみローカルに定義します。それは機能の範囲しか持っていません。それは関数内でのみアクセスできます。

機能の外にl_armにアクセスしようとすると、エラーが発生します。l_armは定義されていません。

あなたは、これらすべての変数外の機能にアクセスしたい場合は、これは動作しますclass

#Hit Zones 
l_arm=[] 
r_arm=[] 
l_leg=[] 
r_leg=[] 
hit_region_list = [l_arm , r_arm, l_leg, r_leg] 


#Wound Pretty Names 
healthy = "Healthy" 
skin_cut = "Skin Cut" 
muscle_cut = "Muscle Cut" 
bone_cut = "Exposed Bone" 

class Character: 
    ... 
    ... 
    ... 

john = Character(34, 33, 33) 

john.hit(l_arm, skin_cut) 

の上に、それを定義することができます。

+0

これは私にいくつかの情報を与えますが、ヒット領域の空リストをクラスの前(前)に定義すると、異なる文字に対して異なるヒットリストを持つことは不可能になります。もし私がクラス__init__?の変数を定義しているとしますか? –

関連する問題