类属性未传递给对象

时间:2013-10-18 12:02:37

标签: python class attributes

我正在尝试创建一个非常基本的类似RPG的游戏,你可以选择一个角色,给角色一个武器,然后告诉它根据角色和武器的属性攻击另一个角色。 weapon类属于名为Equip的顶级类。但是,当我尝试设置包含武器统计数据的攻击伤害变量时,我得到:

'Char' object has no attribute 'weapon.'

我将Charweapon值设置为None作为默认值。但是下面,我使用deandean.weapon = sword)给角色(weapon)一个武器。我已尝试将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 个答案:

答案 0 :(得分:2)

请记住,与其他self方法一样,使用__init__来制作实例的属性。

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

另外,我认为其他属性也应该是实例属性,即在__init__方法中设置它们并使用self,例如self.wgtself.impactself.broken_bones

答案 1 :(得分: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