繁体   English   中英

在python 2.7中调用超级子类

[英]calling super subclass in python 2.7

我正在尝试了解python中的一些基本OOP。 如果我尝试对诸如list之类的类进行子类化,该如何调用父构造函数? 修补了片刻之后,我发现它是:

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])

list.__init__(iterable)缺少其中列出来初始化信息,并list(iterable)建立不同的名单完全无关你想初始化一个。

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

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

list.__init__(self, args)

那会起作用。 尽管通常使用super()可以使语法更简洁。 例如,以上内容可以重写为:

super(slist, self).__init__(args)

但是,鼓励您使用super()而不是简单地调用父构造函数,主要原因是您具有多个继承。 super()将自动以正确的顺序调用每个父类的构造函数。 这与Python的“ 方法解析顺序”密切相关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM