我试图理解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])
答案 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密切相关。