2013-06-24 69 views
0

我正在開發一款遊戲,我想要做的事情之一就是擁有一個定義屬性損害的基類,並使用構造函數來啓動該值。這是我的基類在類中調用基本方法

class Weapon(object): 
def __init__(self, damage): 
    self.damage = damage 

這是實際的類的武器,呼籲遊戲

class Crossbow(Weapon): 
is_loaded = True 
reloads = 5 
def __init__(self, is_loaded, reloads): 
    super(Crossbow, self).__init__() 
    self.is_loaded = is_loaded 
    self.reloads = reloads 

def reload(self): 
    print "You need to reload, before you can fire again" 
    time.sleep(2) 
    if reloads > 0: 
     print "Reloading bow" 
     time.sleep(2) 
     reloads -= 1 
     is_loaded = True 
     print "Successfully reloaded bow" 
     time.sleep(1) 
     print "You now have",reloads,"arrow left" 
     time.sleep(2) 
    else: 
     print "You don't have any more arrows" 
     time.sleep(2) 

使用我測試的重載函數:

c = Crossbow(Weapon) 
for i in range(1,6): 
    c.reload() 

我跑的原因班級方法6次,是我想測試重新加載變量的數量,你要重新加載多少次。它每次計算都會減去,一旦它減少到零,它不會讓你重新加載,所以6次就能夠測試完整的功能。然而,當我運行的代碼塊,我得到這個錯誤:

me.py", line 47, in <module> 
c = Crossbow(Weapon) 
TypeError: __init__() takes exactly 3 arguments (2 given) 
我以前用過類

,但我是新來創建一個基類,構造函數和調用其它類關的那個。如果有人能幫助我理解我的問題,我將非常感激。

+1

不要嘗試爲類屬性聲明的默認值。這不是一個「可選的好東西」,它把那些不應該存在的東西放在那裏。在Python中,創建實例屬性的正確方法是隻分配'self.attribute = ...' –

+0

是的,這是一種常見的做法,但通常很糟糕。 –

回答

0

您使用c = Crossbow(initial_load_state, initial_reloads)創建弩的實例,而不是c = Crossbow(Weapon)。 (另外,你的超類的構造函數調用缺少一個damage參數。)

1

當你爲類的__init__方法指定一個位置參數時,這意味着你每次實例化類時都要傳遞參數。由於您已將is_loadedreloads聲明爲您的Crossbow類的__init__方法的位置參數,因此您必須在實例化時提供它們。在您的測試代碼中,您提供Weapon類別的電話號碼作爲您的__init__電話的第一個位置參數is_loaded的值。當然,這是錯誤的,但不是語法錯誤。根本沒有提供任何參數爲reloads,這是一個語法錯誤。

你不妨爲如果沒有提供,將要使用的參數,如設置默認值:

def __init__(self, is_loaded=True, reloads=5): 
    super(Crossbow, self).__init__(damage=5) # or whatever for damage 

如果你這樣做,你可以不明確設定值實例。

你也可以設置默認值無,只覆蓋在非無值類的值:

def __init__(self, is_loaded=None, reloads=None): 
    super(Crossbow, self).__init__(damage=5) 
    if is_loaded is not None: 
     self.is_loaded = is_loaded 
    if reloads is not None: 
     self.reloads = reloads