2013-10-18 111 views
0

我正在尝试创建一个非常基本的类RPG游戏,您可以在其中选择一个角色,给该角色一个武器,然后根据该角色的统计信息告诉其攻击另一个角色性格和武器。 weapon类属于称为Equip的顶级类。当我尝试但是设置结合了武器的统计攻击损伤变量,我得到:不传递给对象的类属性

'Char' object has no attribute 'weapon.' 

我有Charweapon值设置为None为默认值。但在下面,我使用dean.weapon = sword(这是一个weapon)给出了字符(dean)的武器。我试过将weapon.wgt更改为self.weapon.wgt,但这似乎没有帮助。

查看代码的相关部分,而忽略了attack代码,因为我不认为它与问题相关,会使事情混乱,但如果有必要,我会尽力的。

我相信代码是一团糟,所以建设性的批评将不胜感激。

代码:

class Char(object): 

    def __init__(self, name): 
     name = name 
     hp = 300 
     mp = 10 
     strn = 1 
     dmg = 1 
     dex = 1 
     armor = 0 
     weapon = None 

    attack_speed = dex 

    intact_bones = ["right arm", "left arm", "right leg", "leg leg", "skull", "sternum", "nose"] # JUST ASSUME RIGHT SIDE IS PRIMARY SIDE FOR NOW 

    broken_bones = [] ### define what to do per bone if bone is in this list 

    dmg = strn * self.weapon.wgt 


class Equip(object): 
    wgt = 1 
    desc = "" 

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

class weapon(Equip): 
    impact = 1 
    sharp = 1 

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

sword = weapon("Sword") 
sword.wgt = 10 
sword.impact = 6 
sword.sharp = 7 


dean.weapon = sword 
dean.attack(hamilton) 

回答

2

记住使用self,在你的其他__init__方法,使实例的属性。

def __init__(self, name): 
    self.name = name 
    self.hp = 300 
    ... 
    self.weapon = None 

另外,我觉得其他属性也应该是实例属性,即,将它们设置在__init__方法和使用self,例如self.wgtself.impactself.broken_bones等构造体

+0

嗯,有道理。好吧,当我回家后,我会试试这个,看看是否能解决这个问题。谢谢。 – rrr45

+0

好的,就是这样。所以,基本上,我通常应该把自己置于__init__之下的所有内容之前,看起来像? 此外,我现在有一个相同的代码的新问题。我对StackOverflow相当陌生。我应该问这里还是开始一个新线程? – rrr45

+0

@ rrr45好吧,不是_everything_,而是应该是实例属性的所有东西。如果你声明了一些临时变量,你不需要使用'self'。很高兴我能帮上忙。如果您有后续问题,则应将其作为新问题发布,但也可以在上下文中添加此问题的链接。 –

1

变化,因为现在你要分配值的局部变量,而不是对象变量:

def __init__(self, name): 
    self.name = name 
    self.hp = 300 
    self.mp = 10 
    self.strn = 1 
    self.dmg = 1 
    self.dex = 1 
    self.armor = 0 
    self.weapon = None 
相关问题