Python继承调用构造函数Issu

2024-04-19 22:18:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下类继承结构:

class BuffEvent(object):
    def __init__(self, buffable):
        self.buffable = buffable


class BattleEvent(BuffEvent):
    def __init__(self, battle, buffable):
        super(BuffEvent, self).__init__(buffable)
        self.battle = battle


class BattleStartEvent(BattleEvent):
    def __init__(self, battle, buffable):
        super(BattleEvent, self).__init__(battle, buffable)

然后我试着这样调用BattleStartEvent的构造函数:

BattleStartEvent(battle, battle.attacker)

但我得到以下错误:

    super(BattleEvent, self).__init__(battle, buffable)
TypeError: __init__() takes 2 positional arguments but 3 were given

在BattleStartEvent中,构造函数中有两个参数,所以我有点困惑。我做错什么了


Tags: selfobjectinitdef错误结构classsuper
1条回答
网友
1楼 · 发布于 2024-04-19 22:18:15

你的问题不在于BattleStartEvent的构造函数。它需要两个参数(除了self),这就是你传递给它的

你的问题是,在所说的构造器中的行:

super(BattleEvent, self).__init__(battle, buffable)

执行super(BattleEvent, self)实际上返回类BuffEvent,该类接受一个参数,正如您看到的,您正在向它传递2


要解决此问题,请执行以下操作之一:

  1. 修复^{}调用以使用实际类本身,而不是父类(在所有类中):

    class BattleStartEvent(BattleEvent):
        def __init__(self, battle, buffable):
            super(BattleStartEvent, self).__init__(battle, buffable)
    
  2. 在python3中:用“empty”super调用:super().__init__(battle, buffable)

  3. 我猜这段代码只是用于一个可复制的示例,但是如果您的__init__实际上除了调用super之外什么都不做,那么您可以省略它的实现,并且默认情况下将调用父级的__init__


有关super的更多有用信息,请参见Raymond Hettinger的Python’s super() considered super!

相关问题 更多 >