2017-04-01 98 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