python面向对象编程方法

python面向对象编程方法,python,oop,Python,Oop,我已经定义了下面的代码,但似乎有关于方法加载和损坏的问题 根据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):

我已经定义了下面的代码,但似乎有关于方法加载和损坏的问题

根据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()
_

但对于printbow.shots\u left,我得到了0,printarrows.get\u数量,我得到了5。它们是相反的。我想我的问题是我没有装弹药?我不是很确定。任何帮助都将不胜感激。谢谢大家!

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
主要问题:Ammo的武器类型是一个方法,而不是属性或属性,并且您没有调用它,因此您将方法本身与名称进行比较,而不是调用它的结果。这就是为什么load什么都不做的原因;任何方法都不等于字符串

其他问题:

看起来您是在类上调用方法,而不是在实例上调用方法。将ammo实例作为参数传递,然后调用ammo类上的方法

类似地,您的破坏方法可能应该调用super.damage而不是武器.damage,因为后者不使用您的实例状态。你有打字错误的截图和截图,这会使代码在其他方面失去功能


简短版本:这段代码被分解成无数种方式,在修复之前的问题时,您会遇到每一种方式。

Ammo类是什么样子的?加载函数应该使用Ammo变量,而不是Ammo类。我不知道这段代码在解释器中是如何执行的;我已经注意到至少两个运行时错误,它们会破坏程序的运行execution@taylorswift:那是我最初的印象,但事实证明,将方法与字符串进行比较的一个大错误是确保所有其他中断的代码路径永远不会执行。@ShadowRanger您知道,在编译语言中,这是我们认为理所当然的事情……感谢您的输入!我已经编辑了我的代码,现在伤害可以正常工作,但是在通过调用ngammo.wealth\u type==self.name调用武器类型之后,输出仍然是相反的。如何改进代码?谢谢@elle:输出不会反转,除非在你的武器或东西的实现中隐藏着一些真正奇怪的东西。我只是运行了你的代码来替换一个微不足道的武器定义,只是没有继承无关的东西,它完全按照它应该的那样工作,弓是加载的,箭头是空的。旁注:习惯上,没有理由使用像get_quantity这样的getter方法。只需直接访问quantity属性。如果您需要给它更多的逻辑性,您可以将任何属性重新实现为@property,将其重命名为_quantity,而无需更改向类的使用者公开的接口。
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