我在使用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()
在这里不起作用。
答案 0 :(得分:3)
super()
已经为您传递了self
。 super(IPAddressSimple)
无法了解self
,因此在这种情况下,您需要致电super(IPAddressSimple).__init__(self, ip_type)
。但super()
(super(IPAddressSimple, self)
的语法糖)知道self
并处理它,因此您只能手动传递ip_type
。