Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python 2.7中调用超子类_Python_Python 2.7_Inheritance - Fatal编程技术网

在python 2.7中调用超子类

在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

我试图理解python中的一些基本OOP。如果我试图对一个类(如list)进行子类化,我如何调用父构造函数?经过一段时间的修补,我发现它是:

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)