我正在尝试创建一个具有泛型__init__
值的类,但其子类具有默认值,因此:
class Enemy:
def __init__(self, difficulty, power, MaxHP, magic, MaxMP, speed, name):
self.power = power + 2*difficulty
self.HP = self.MaxHP = MaxHP + 5*difficulty
self.magic = magic + 2* difficulty
self.MP = self.MaxMP = MaxMP + 5*difficulty
class Goblin(Enemy):
def __init_(self, difficulty = 1, power = 1, MaxHP = 5, magic = 1, MaxMP = 5, speed = 5, name = "Goblin"):
super(Goblin, self).__init__(self, power, MaxHP, magic, MaxMP, speed, name)
然而,当我试图创建一个没有全部默认值的Goblin对象时(比如,我只需要输入一个困难的值),它告诉我需要全部8个参数,即使其余的都是默认值。我不能这么做是有什么原因吗?还是我做错了什么?
因为你在没有
difficulty
的情况下调用了super(Goblin, self).__init__(self, power, MaxHP, magic, MaxMP, speed, name)
。如果在2.x上(考虑到使用super
的旧方法,我猜您一定是这样),您可能还希望像class Enemy(object)
那样继承,以确保Enemy
是一个新样式的类。下面是一个简单的例子:
输出:
编辑:
好吧,如果下面的方法不起作用,也许您的解释器中缓存了旧的类定义(尝试在新的解释器上运行它)。
此代码对我有效:
我必须改变你的方式才能让它工作:
Goblin
中的def __init__
拼写错误。Goblin()
提出了TypeError: __init__() takes exactly 8 arguments (1 given)
,因为Goblin没有定义__init__
方法,所以它从Enemy
继承了没有默认值的方法object
将Enemy
更改为新样式的类super()
时,我得到了TypeError: must be type, not classobj
;我不确定旧版本的Python是否允许它,或者是否触发了不同的错误,但是我知道旧样式的类与新样式的类具有不同的MRO(方法解析顺序)规则,而且我相信这无论如何都会使super
变得异常。super(Goblin, self).__init__(self, ...)
的调用中删除第二个self
self
被自动传递给super(Class, self).some_method(...)
,所以自己把它放在那里就像调用Enemy.__init__(self, self, difficulty, power, ...)
。super(Goblin, self).__init__(...)
的调用中添加了difficulty
Goblin.__init__
中设置了默认值,但随后没有将值传递到Enemy.__init__
。我想是因为这个。
相关问题 更多 >
编程相关推荐