在python 2.7中调用超子类
我试图理解python中的一些基本OOP。如果我试图对一个类(如list)进行子类化,我如何调用父构造函数?经过一段时间的修补,我发现它是:在python 2.7中调用超子类,python,python-2.7,inheritance,Python,Python 2.7,Inheritance,我试图理解python中的一些基本OOP。如果我试图对一个类(如list)进行子类化,我如何调用父构造函数?经过一段时间的修补,我发现它是: super(subclass_name, self).__init__(args). 然而,我并不直觉地理解这一点。为什么我不能只做列表(args)?或 以下是相关的代码片段: class slist(list): def __init__(self, iterable): #super(slist, self).__init__(iter
super(subclass_name, self).__init__(args).
然而,我并不直觉地理解这一点。为什么我不能只做列表(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])
类列表(列表):
定义初始值(自,可编辑):
#super(slist,self)。\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
如果您不想使用super
,可以使用list.\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。您需要告诉它正在初始化哪个对象<代码>列表(args)
甚至更不正确,因为它创建了一个全新的列表对象,而不是初始化对象。它调用list.\uuu new\uuu()
而不是list.\uuu init\uuuu()
。您需要将self
传递给构造函数调用以正确初始化父类:
list.__init__(self, args)
那就行了。但是使用super()
通常允许更清晰的语法。例如,上述内容可以改写为:
super(slist, self).__init__(args)
但是,鼓励使用super()
而不是简单地调用父构造函数的主要原因是,在有多重继承的情况下super()
将按正确顺序自动调用每个父类的构造函数。这与Python的特性密切相关
super(slist, self).__init__(args)