2014-05-16 5 views
-3

У меня возникла проблема с точки зрения назначения объектов. Я хочу, чтобы иметь возможность назначать объект через функцию, но поскольку переменная name не определена до тех пор, пока во время функции, когда я сначала вызываю функцию (с именем = john), она говорит: NameError: name 'john' is not defined.Определение переменной после ее вызова?

Я использую этот сценарий, чтобы помочь мне, когда я бегу сеанса игры, и я хочу, чтобы иметь возможность создавать новую NPC, по желанию, но в любом случае, чтобы сделать это без первого использования: >>> blahblah = Character() в питоне незамедлительный?

Извините за блок кода, и я сожалею, если есть простое решение.

import random 
import math 

combat_participants = [] 
npc_list = [] 

class Character(): 
    """Basic class for character statistics 
    """ 
    def get_stats(self): 
     """Refreshes the stats after new assignment 
     """ 
     self.hp = self.st 
     self.will = self.iq 
     self.per = self.iq 
     self.fp = self.ht 
     self.bspeed = (self.ht + self.dx)/4 
     self.dodge = math.floor(self.bspeed + 3) 
     self.bmove = math.floor(self.bspeed) 
     self.blift = round(self.st*self.st/5) 
    def get_status(self): 
     """Checks the status of the character 
     """ 
     if self.hp < -self.hp: 
       self.status = 'Dead' 
     elif self.hp < 0: 
       self.status = 'Unconscious' 
     else: 
       self.status = 'Alive' 
    #Primary Attributes 
    st = 10 
    dx = 10 
    iq = 10 
    ht = 10 
    #Secondary Attributes 
    hp = st 
    will = iq 
    per = iq 
    fp = ht 
    bspeed = (ht + dx)/4 
    dodge = math.floor(bspeed + 3) 
    bmove = math.floor(bspeed) 
    blift = round(st*st/5) 
    #Other 
    status = 'Alive' 
    weapon = 'None' 
    shield = 'None' 
    char_name = '' 

def create_npc(name, str_name, level, combat): 
    """ 
    /long and irrelevant/ 
    """ 
    name = Character() 
    name.char_name = str_name 

    #Randomly assigning attributes 
    prim_attr_list = [name.st, name.dx, name.iq, name.ht] 
    for attr in prim_attr_list: 
     attr = random.randint(7+level,9+level) 
    name.get_stats(name) 

    #Randomly assigns a weapon 
    temp_weapon_list = [] 
    for weapon in weapon_list: 
     if weapon.st <= name.st: 
    temp_weapon_list += weapon 
    name.weapon = temp_weapon_list[random.randint(0,len(temp_weapon_list)-1)]).wep_name 

    #Adds them to the npc list 
    global npc_list 
    npc_list += [name] 

    #Adds them to combat list if they are in combat 
    global combat_participants 
    if combat: 
     combat_participants += [name] 

EDIT: EDIT: После вызова функции с create_npc ('Джон', 'Джон Смитсон II', 2, True)

После того, как я назначен obect класса, как 'john' вместо john, я не знаю, как получить к нему доступ. Например: >>> john.char_name даст мне эту ошибку NameError: name 'john' is not defined и >>> 'john'.char_name дает мне AttributeError: 'str' object has no attribute 'char_name'

+3

Это 'john' или' 'john' '? – Christian

+0

Это просто 'john' – KieranM

+0

А что тогда' john'? – Christian

ответ

0

Что вы хотите сделать, это добавить метод __init__() к вашему классу Character. Ниже приведен упрощенный класс Character:

class Weapon: 

    def __init__(self, name, damage): 
     self.name = name 
     self.damage = damage 
     self.level = 1 

    def upgrade(self): 
     self.level += 1 
     self.damage += 10 

class Character: 

    def __init__(self, name, level, weapon): 
     self.name = name 
     self.level = level 
     self.weapon = weapon 

     self.max_hp = self.get_max_hp() 
     self.hp = max_hp 

    def get_max_hp(self): 
     return 100 + self.level*10 

    def get_status(self): 
     if self.hp <= 0: 
      return 'Dead' 
     elif self.hp < self.max_hp: 
      return 'Unhealthy' 
     else: 
      return 'Healthy' 

    def level_up(self): 
     self.level += 1 
     self.max_hp = self.get_max_hp() 
     self.weapon.upgrade() 

    def attack(self, npc): 
     npc.hp -= self.weapon.damage 

>>> sword = Weapon('sword', 15) 
>>> spear = Weapon('spear', 20) 
>>> npc1 = Character('john', 5, sword) 
>>> npc2 = Character('james', 1, spear) 
>>> npc1.name 
'john' 
>>> npc1.level 
5 
>>> npc1.max_hp 
150 
>>> npc1.weapon.name 
'sword' 
>>> npc1.weapon.damage 
15 
>>> npc1.weapon.upgrade() 
>>> npc1.weapon.damage 
25 
>>> npc1.hp 
150 
>>> npc1.get_status() 
'Healthy' 
>>> npc2.attack(npc1) 
>>> npc1.hp 
130 
>>> npc1.get_status() 
'Unhealthy' 
>>> for i in range(10): 
     npc2.attack(npc1) 
>>> npc1.hp 
-70 
>>> npc1.get_status() 
'Dead' 
>>> npc1.level_up() 
>>> npc1.level 
6 
>>> npc1.weapon.damage 
35 
>>> npc1.max_hp 
160 
+0

Спасибо, это имеет для меня большой смысл – KieranM

+0

@KieranM Я добавил класс оружия и еще некоторое использование класса символов. Надеюсь, вы сможете понять, как расширить и адаптировать это для ваших целей. –

0

Вам не нужно передать имя функции, удалить, что из параметров определения функции и код должен работать нормально.

+0

Использовать str_name вместо имени в этом случае: 'name = Character () ' – KieranM

+0

Вы удаляете параметр param из своей функции create_npc, а затем просто называете его * create_npc ('john smithson II', 2, True) * –

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