2016-03-20 3 views
2

Я изучаю python и пытаюсь написать систему раны на основе горячих зон персонажа. Вот что я написал. Не судите меня слишком.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) 

Я бы ожидать для skin_cut входа, чтобы быть признанным в качестве «порезаться», а затем добавил к l_arm, который я определил как список. Тем не менее, я всегда получаю ошибку имени (l_arm не определен). Если я переписал метод с «раной» в качестве первого аргумента, то теперь «Ошибка имени» будет иметь «рану», как не определенную. Это говорит мне, что это что-то в структуре класса, который я пропустил, но я не могу сказать, что.

+0

Локальные переменные, например. l_arm, уничтожаются, когда функция завершает выполнение. – 7stud

+0

Не могли бы вы предоставить ошибку? – Nilesh

+0

@ Лафада, это очевидно! – 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 

После выполнения кода я получил этот выход

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

Согласно сообщению, я думаю, что это то, что вы хотели. Согласно вашему предыдущему коду, ваши объявления были доступны только внутри функции. Теперь вы можете манипулировать данными и этими переменными для определенных экземпляров, объявляя их внутри конструктора.

+0

Существует гораздо больше, чем просто. Посмотрите на код еще раз. – idjaw

+1

Спасибо за ваш комментарий. Виноват. Я обновил свой ответ. – denis

+0

np. Вы должны исправить свой отступ и дать некоторое объяснение относительно того, почему вы предоставляете изменение кода. Чем больше контекста, почему код, который вы предоставляете, исправляет их проблемы, тем лучше. Просто дружеский совет.:) – idjaw

0

Каждая локальная переменная, назначенная внутри функции, отбрасывается, как только функция заканчивается. Вам нужно добавить self. к таким именам, чтобы они сохранялись как переменные экземпляра, такие как self.l_arm, self.r_arm и т. Д. То же самое относится к красивым именам раны, если вы планируете позже использовать эти объекты.

+0

Не был ли я ... Тем не менее, есть немного больше для решения проблемы ОП, чем я думаю. Они пытаются вызвать метод «hit», назначая переменные, созданные внутри 'hit'. Таким образом, эти атрибуты должны быть доступны до того, как вы вызовете этот метод. Вероятно, в их 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__ ?. –

Смежные вопросы