0

我正在开发一款游戏,我想做的一件事是拥有一个定义属性损坏的基类,并使用构造函数来启动该值。这是我的基类

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

这是为游戏调用 Wea​​pon 的实际类

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 次的原因是我想测试 reload 变量,它计算你重新加载的次数。它每次计数都会减去,一旦达到零,它就不会让你重新加载,所以 6 次就可以测试完整的功能。但是,当我运行该代码块时,出现此错误:

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

我以前使用过类,但我不熟悉创建基类和构造函数并从中调用其他类。如果有人可以帮助我理解我的问题,我将不胜感激。

4

2 回答 2

1

当您为类的__init__方法指定位置参数时,这意味着您承诺在每次实例化类时传递参数。因为您已将is_loaded和作为类方法的reloads位置参数声明,所以必须在实例化时提供它们。在您的测试代码中,您将类作为调用的第一个位置参数的值提供,. 这当然是错误的,但不是语法错误。您根本没有为 提供任何参数,这是语法错误。Crossbow__init__Weapon__init__is_loadedreloads

您可能希望为未提供时将使用的参数设置默认值,例如:

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

如果这样做,您可以在不显式设置值的情况下进行实例化。

您还可以将默认值设置为 None 并且仅在非 None 值上覆盖类的值:

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
于 2013-06-24T02:50:17.713 回答
0

你创建一个 Crossbow 的实例c = Crossbow(initial_load_state, initial_reloads),而不是c = Crossbow(Weapon)。(此外,您的超类构造函数调用缺少damage参数。)

于 2013-06-24T02:47:34.857 回答