在python 2.7中调用超级子类

时间:2017-07-09 20:06:15

标签: python python-2.7 inheritance

我试图理解python中的一些基本OOP。如果我尝试子类化类列表,我如何调用父构造函数?经过修修补补后,我发现它是:

super(subclass_name, self).__init__(args). 

但是我不直观地理解这一点。为什么我不能做列表(args)?或

list.__init__(args)? 

以下是相关摘录:

class slist(list):
  def __init__(self, iterable):
    #super(slist, self).__init__(iterable)  <--- This works)
    list.__init__(iterable) # This does not work
    self.__l = list(iterable)

  def __str__(self):
    return ",".join([str(s) for s in self.__l])

2 个答案:

答案 0 :(得分:4)

list.__init__(iterable)缺少要初始化的 列表的信息,而list(iterable)会构建一个与您尝试初始化的列表完全无关的其他列表。< / p>

如果您不想使用super,则可以执行list.__init__(self, iterable)

答案 1 :(得分:2)

list.__init__(iterable)不正确。您需要告诉__init__()它正在初始化哪个对象。 list(args)更加不正确,因为它创建了一个全新的列表对象,而不是初始化您的对象。它会调用list.__new__()而不是list.__init__()。您需要将self传递给构造函数调用才能正确初始化父类:

list.__init__(self, args)

那会有用。使用super()通常允许更清晰的语法。例如,以上内容可以改写为:

super(slist, self).__init__(args)

但是,鼓励使用super()而不是简单地调用父构造函数的主要原因是用于多重继承的情况。 super()将以正确的顺序自动调用每个父类的构造函数。这与Python的Method Resolution Order密切相关。