我正在开发一个游戏,我想要做的一件事就是拥有一个定义属性损坏的基类,并使用构造函数来启动该值。这是我的基类
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)
我之前使用过类,但我是新手创建基类和构造函数并调用其他类。如果有人能帮我理解我的问题,我会非常感激。
答案 0 :(得分:1)
当您为类的__init__
方法指定位置参数时,这意味着您每次实例化类时都会提交传入参数。由于您已将is_loaded
和reloads
声明为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
参数。)