2016-03-20 5 views
2

J'apprends le python et j'essaie d'écrire un système de blessure basé sur les zones chaudes d'un personnage. Voici ce que j'ai écrit. Ne me juge pas trop.Python: variables à l'intérieur des méthodes de classe

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) 

Je pense à l'entrée skin_cut pour être reconnu comme « Cut de la peau », puis ajouté à l_arm, que je définis comme une liste. Cependant, je reçois toujours une erreur de nom (l_arm n'est pas défini). Si je réécris la méthode avec la 'blessure' comme premier argument, l'erreur de nom vient maintenant avec 'blessure' comme non défini. Ce genre de me dit que c'est quelque chose dans la structure de la classe que j'ai raté, mais je ne peux pas dire quoi.

+0

Variables locales, par ex. l_arm, sont détruits quand une fonction a fini d'être exécutée. – 7stud

+0

Pouvez-vous s'il vous plaît fournir une erreur? – Nilesh

+0

@Lafada, c'est évident! – 7stud

Répondre

1

Je change ma réponse précédente à ceci.

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 

Après avoir exécuté le code ci-dessus, je suis cette sortie

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

Comme par le poste, je pense que c'est ce que vous vouliez. Selon votre code précédent, vos déclarations étaient accessibles uniquement à l'intérieur d'une fonction. Vous pouvez maintenant manipuler les données et ces variables pour des instances particulières en les déclarant dans le constructeur.

+0

Il y a beaucoup plus que cela. Regardez le code à nouveau. – idjaw

+1

Merci pour votre commentaire. Ma faute. J'ai mis à jour ma réponse. – denis

+0

np. Vous devez corriger votre indentation et expliquer pourquoi vous fournissez ce changement de code. Plus le contexte entourant la raison pour laquelle le code que vous fournissez corrige son problème, mieux c'est. Juste quelques conseils amicaux.:) – idjaw

0

Chaque variable locale affectée à une fonction est éliminée dès la fin de la fonction. Vous devez ajouter self. à ces noms afin qu'ils soient enregistrés en tant que variables d'instance, telles que self.l_arm, self.r_arm, et ainsi de suite. La même chose vaut pour les jolis noms de blessure, si vous prévoyez d'utiliser ces objets plus tard.

+0

Etait pas moi .... Cependant, il y a un peu plus à résoudre problème OP que je pense. Ils essaient d'appeler la méthode 'hit' en assignant des variables créées dans' hit'. Donc, ces attributs doivent être disponibles avant même d'appeler cette méthode. Probablement dans leur init aussi .. – idjaw

1

Vous définissez l_arm dans la fonction et son local à cette fonction uniquement. Il a une portée de fonction seulement. Cela peut être consulté à l'intérieur de la fonction seulement.

Vous essayez d'accéder à la fonction extérieure l_arm, et cela donne une erreur, l_arm n'est pas définie.

Si vous souhaitez accéder à toutes ces variables fonction en dehors, vous pouvez définir ci-dessus 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) 

Cela fonctionne.

+0

Cela me donne quelques informations, mais si je définis les listes vides de la région cible à l'extérieur (avant) de la classe, il sera impossible d'avoir différentes listes de résultats pour différents caractères. Peut-être que si je définis les variables dans la classe __init__? –