【问题标题】:Python: How to create attributes that depend on other attributes within an instancePython:如何创建依赖于实例中其他属性的属性
【发布时间】:2021-06-22 23:22:24
【问题描述】:

我对 Python 非常陌生,第一次开始使用类和字典(也是 StackOverflow 的第一篇文章),但从未使用过实例。我成功创建了一个 Player 类,但因为我想要不同的敌人,所以我创建了一个 Enemy 类。我根据个人喜好将新行上的属性分开。

class Enemy:
    def __init__(self, name, health, maxhealth, head, torso, legs, feet, armor, weapon, damage, gold):
        self.name = name
        self.health = health
        self.maxhealth = maxhealth
        self.head = head
        self.torso = torso
        self.legs = legs
        self.feet = feet
        self.armor = armor
        self.weapon = weapon
        self.damage = damage
        self.gold = gold

skeleton = Enemy("Skeleton",
                  60,
                  60,
                  armors['leatherhelm'],
                  armors['leathertorso'],
                  armors['leatherleggings'],
                  armors['leatherboots'],
                  Enemy.head['defense']+Enemy.torso['defense']+Enemy.legs['defense']+Enemy.feet['defense'],
                  weapons['rustycutlass'],
                  1+Enemy.weapon['damage'], 
                  33)

发生错误,type object 'Enemy' has no attribute 'head'(假设 Enemy 没有 torso、legs、feet 和 weapon)。我最初尝试了self.head,然后才意识到它为什么不起作用,并且还尝试了skeleton.head。有没有办法让我使用这些相互依赖的属性?另外,我需要任何括号吗?任何帮助表示赞赏。

【问题讨论】:

    标签: python class attr


    【解决方案1】:

    编辑:针对 OP 的评论,如何将计算属性(damage 和 armor)移动到 Enemy 类以避免强制它们进入 __init__ 调用?这样,当装甲更新和/或武器改变时,这些属性仍然是正确的。

    例子:

    armors = {
        "leatherhelm": {"defense": 10},
        "leathertorso": {"defense": 5},
        "leatherleggings": {"defense": 3},
        "leatherboots": {"defense": 1},
    }
    weapons = {
        "rustycutlass": {"damage": 6}
    }
    
    class Enemy:
        def __init__(self, name, health, maxhealth, head, torso, legs, feet, weapon, gold):
            self.name = name
            self.health = health
            self.maxhealth = maxhealth
            self.head = head
            self.torso = torso
            self.legs = legs
            self.feet = feet
            self.weapon = weapon
            self.gold = gold
        
        @property
        def armor(self):
            return self.head["defense"] + self.torso['defense'] + self.legs['defense'] + self.feet['defense']
        
        @property
        def damage(self):
            return self.weapon["damage"] + 1
    
    skeleton = Enemy("Skeleton",
                      60,
                      60,
                      armors['leatherhelm'],
                      armors['leathertorso'],
                      armors['leatherleggings'],
                      armors['leatherboots'],
                      weapons['rustycutlass'],
                      33)
    
    print(skeleton.damage)
    print(skeleton.armor)
    

    输出:

    print(skeleton.damage)
    print(skeleton.armor)
    

    【讨论】:

    • 这确实有效,但我担心如果敌人改变他们的武器或盔甲,它仍然可以防御和攻击他们的旧装备。对于 Player 和 Enemy 来说,这更像是一个问题,但仍然希望它能够正常工作。例如:```如果skeleton.hp >30:skeleton.weapon =武器['secretattack'] ```
    猜你喜欢
    • 1970-01-01
    • 2017-12-16
    • 2016-07-08
    • 1970-01-01
    • 2011-09-09
    • 2017-02-08
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多