【问题标题】:python object oriented programming methodspython面向对象的编程方法
【发布时间】:2017-04-01 04:18:54
【问题描述】:

我已经定义了以下代码,但似乎有关于方法 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。它们是相反的。我认为我的问题是我没有加载弹药数量?我不太确定。任何帮助,将不胜感激。谢谢!

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 类是什么样的?
  • 你的加载函数应该使用ammo变量而不是Ammo
  • 我不知道这段代码在你的解释器中是如何执行的;我已经可以看到至少两个运行时错误会破坏这个程序的执行
  • @taylorswift:这是我最初的印象,但事实证明,其中一个大错误(将方法与字符串进行比较)确保所有其他损坏的代码路径永远不会执行。
  • @ShadowRanger 你看这是我们在编译语言中认为理所当然的事情......

标签: python oop


【解决方案1】:

主要问题:Ammoweapon_type 是一个方法,而不是属性或属性,并且您没有调用它,因此您将方法本身与 name 进行比较,而不是结果调用它。这就是load 什么都不做的原因;没有任何方法等于字符串。

其他问题:

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

同样,您的damage 方法可能应该调用super().damage() 而不是Weapon.damage(),因为后者不使用您的实例状态。而且你有错别字(shots vs. shot)应该使这段代码在其他方面不起作用。

短版:此代码被一百万种方式破坏,您在修复之前的问题时会遇到每种方式。

【讨论】:

  • 感谢您的意见!我已经编辑了我的代码,现在damage 运行良好,但是在通过调用ammo.weapon_type()==self.name 调用weapon_type 之后,输出仍然是相反的。如何改进我的代码?谢谢!
  • @elle:输出不会反转,除非在您的WeaponThing 的实现中隐藏着真正奇怪的东西。我刚刚运行了您的代码(替换了Weapon 的简单定义,只是没有从无关的Thing 继承),它完全按照预期工作,bow 已加载,arrows 为空。
  • 旁注:习惯上,没有理由拥有像get_quantity 这样的“getter”方法。只需直接访问quantity 属性即可。如果你需要给它更多的逻辑,你可以重新实现为@property(将任何属性重命名为_quantity,而不改变暴露给你的类的消费者的接口。
猜你喜欢
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
相关资源
最近更新 更多