在类中调用基本方法

时间:2013-06-24 02:43:28

标签: python inheritance

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

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)

我之前使用过类,但我是新手创建基类和构造函数并调用其他类。如果有人能帮我理解我的问题,我会非常感激。

2 个答案:

答案 0 :(得分: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

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

您也可以将默认值设置为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

答案 1 :(得分:0)

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