【问题标题】:Why inserting __init__() of superclass in this case?为什么在这种情况下插入超类的 __init__() ?
【发布时间】:2013-08-19 07:23:26
【问题描述】:

我现在正在阅读 HeadFirstPython 并且有一个关于类的示例。

>>> class NamedList(list):
>>>    def __init__(self, a_name):
>>>        list.__init__([])
>>>        self.name = a_name

在这种情况下,为什么要使用语句list.__init__([])? 也无法理解为什么它包含空的[]

【问题讨论】:

标签: python class initialization


【解决方案1】:

通常,因为调用您要继承的类的初始化程序是好习惯

但是,作者似乎用self 代替了一个空列表;我会使用以下之一:

super(NamedList, self).__init__()
super(NamedList, self).__init__([])

或者至少提供一个明确的self 参数:

list.__init__(self)

在这种情况下,您正在继承list;它的初始化器需要一个初始元素列表,但您自己的初始化器只需要a_name,因此超类初始化器会传递一个显式的空列表。

list.__init__() 方法只是清除和扩展;它相当于self.clear(); self.extend(argument),重置它的大小并使其可以在__init__()被多次调用时重复使用。

将一个新的列表对象传递给list 初始化程序会使调用完全无用且无操作;这是技术审查肯定漏掉的错误。

【讨论】:

  • 但是为什么要在 init 方法中写空的 '[]' 呢?把“自己”放在一边怎么样?
  • 其实这点很好。正确的调用方式是list.__init__(self, [])..
  • 你在previous question 中也忽略了这一点。
  • @LauritzV.Thaulow:我在寻找书名和班级名称.. 投票结束为骗子。
  • @MartijnPieters 我想你误会了。我的意思是您在your answer 中忽略了与我链接到的问题相同的错误(缺少self)。
【解决方案2】:

书中的代码包含错误。 list.__init__([])缺少一个参数,注释掉它没有任何区别,只是稍微加快了你的程序。

当我读到你的问题时,我几乎不敢相信,因为我最近回答了一个 similar question 关于另一本书(“学习 Python”)中的代码,其中包含完全相同的错误

以下是更正后的行:

        list.__init__(self, [])

当直接在类对象上调用方法(不是静态方法或类方法)时,通常隐式的第一个参数self 必须显式提供。另一种更正这条线的方法是使用super,这使得self 参数是隐式的。

        super(NamedList, self).__init__([])

[] 参数在任何一种情况下都是不必要的,但编写显式代码是一个好习惯,在这种情况下,它表明我们确实希望列表为空。

本书中的代码所做的是提供一个空列表 ([]) 作为 self 参数。这会导致 that 列表被初始化(再次),之后它很快就会被垃圾收集,因为任何地方都没有对它的引用。换句话说,整行都是死代码。

验证原始行没有效果很简单:暂时将list.__init__([]) 中的[] 更改为非空列表,并观察生成的NamedList 实例不包含这些元素。然后插入self 作为第一个参数,并观察列表中的项目现在已添加到NamedList 实例中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2022-11-27
    • 2021-12-03
    相关资源
    最近更新 更多