python面向对象的编程方法

时间:2017-04-01 04:18:54

标签: python oop

我已经定义了以下代码,但似乎有关于方法loaddamage的问题。

(根据ShadowRanger的建议编辑):

class RangedWeapon(Weapon):
        def __init__(self, name, min_dmg, max_dmg):
            super().__init__(name, min_dmg, max_dmg)
            self.shots=0

        def shots_left(self):
            return self.shots

        def load(self, ammo):
            if ammo.weapon_type()==self.name:
                self.shots+=ammo.get_quantity()
                ammo.remove_all()

        def damage(self):
            if self.shots==0:
                return 0
            else:
                self.shots-=1
                return super().damage()

_

bow = RangedWeapon('bow', 10, 40)
crossbow = RangedWeapon('crossbow', 15, 45)
arrows = Ammo('arrow', bow, 5)
bolts = Ammo('bolt', crossbow, 10)

bow.load(arrows)
print(bow.shots_left()) # should return 5
print(arrows.get_quantity()) #should return 0

但对于print(bow.shots_left())我得到0而print(arrows.get_quantity())我得到了5。它们是相反的。我认为我的问题是我没有加载Ammo数量?我不太确定。任何帮助,将不胜感激。谢谢!

class Ammo(Thing):
    def __init__(self, name, weapon, quantity):
        self.name=name
        self.weapon=weapon
        self.quantity=quantity

    def get_quantity(self):
        return self.quantity

    def weapon_type(self):
        return self.weapon.name

    def remove_all(self):
        self.quantity=0

1 个答案:

答案 0 :(得分:1)

主要问题:Ammo' weapon_type是一种方法,而非属性或属性,而您没有调用它,因此您需要比较该方法本身到name,而不是调用它的结果。这就是load什么都不做的原因;没有方法等于字符串。

其他问题:

看起来你在类上调用方法,而不是在实例上调用方法。您将ammo(一个实例)作为参数传递,然后在Ammo(该类)上调用方法。

同样,您的damage方法可能应该调用super().damage()而不是Weapon.damage(),因为后者不会使用您的实例状态。并且您有错误(shotsshot),这会导致此代码在其他方面无法正常运行。

简短版本:此代码以百万种方式破解,当您修复以前的问题时,您将遇到每个代码。