2017-04-01 90 views
0

我已经定义了下面的代码,但似乎有关于方法loaddamage的问题。python面向对象编程方法

(由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 
+0

“Ammo”类看起来像什么? –

+0

你的加载函数应该使用'ammo'变量而不是类'Ammo' – Weijian

+0

我不知道这个代码是如何在你的解释器中执行的;我已经可以看到至少两个运行时错误,这会导致该程序的执行失败 –

回答

1

主要问题:Ammoweapon_type是一种方法,而不是属性或属性,你也没有告诉它,所以你比较方法本身的name,而不是调用它的结果。这就是为什么load什么都不做的原因;没有方法永远等于一个字符串。

其他问题:

它看起来像你调用类的方法,而不是实例。你通过ammo(一个实例)作为参数,然后调用Ammo(该类)的方法。

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

简短版本:此代码以百万种方式被破解,并且您在修复之前的问题时会遇到其中的每个问题。

+0

感谢您的输入!我已经编辑了我的代码,现在'damage'运行良好,但通过调用'ammo.weapon_type()== self.name'调用'weapon_type'后,输出仍然是反转的。我如何改进我的代码?谢谢! – elle

+0

@elle:输出结果不会颠倒,除非你在执行'Weapon'或'Thing'时隐藏了一些真正奇怪的东西。我只是运行你的代码(代替'Weapon'的简单定义,而不是从不相关的'Thing'继承),它的工作原理与它的要求相同,'bow'被加载,'arrows'为空。 – ShadowRanger

+0

附注:在习惯上,没有理由使用“get_quantity”这样的“getter”方法。只需直接访问'quantity'属性即可。如果你需要给它更多的逻辑,你可以重新实现一个'@ property'(将任何属性重命名为'_quantity',而不改变暴露给你的类的消费者的接口。 – ShadowRanger