Python中的super().__ init __()和显式超类__init __()之间的行为差​​异

时间:2014-12-19 12:39:09

标签: inheritance python-3.x super keyword-argument

我在使用super().__init__()和在我的代码中显式调用超类构造函数之间的行为方面存在无法解释的差异。

class IPElement(object):

def __init__(self, ip_type='IPv4'):
    self.ip_type = ip_type

class IPAddressSimple(IPElement):

    def __init__(self, ip_name, ip_type='IPv4'):
        self.ip_name = ip_name
        super().__init__(self, ip_type=ip_type)

此处,行super().__init__(self, ip_type=ip_type)会导致类型错误:

TypeError: __init__() got multiple values for argument 'ip_type'

当我将呼叫更改为按位置传递ip_type时(例如super().__init__(self, ip_type),我收到了不同的类型错误:

TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given

这些错误都没有对我有意义,当我用超类的显式名称替换super()时,一切都按预期工作。以下工作正常,就像通过位置传递ip_type一样:

class IPAddressSimple(IPElement):

        def __init__(self, ip_name, ip_type='IPv4'):
            self.ip_name = ip_name
            IPElement.__init__(self, ip_type=ip_type)

如果有必要,我当然可以使用对超类__init__方法的显式调用,但我想了解为什么super()在这里不起作用。

1 个答案:

答案 0 :(得分:3)

super()已经为您传递了selfsuper(IPAddressSimple)无法了解self,因此在这种情况下,您需要致电super(IPAddressSimple).__init__(self, ip_type)。但super()super(IPAddressSimple, self)的语法糖)知道self并处理它,因此您只能手动传递ip_type