为什么在Python中使用super()时必须提供classname

时间:2012-09-25 13:08:39

标签: python python-2.7

  

可能重复:
  Why do I have to specify my own class when using super(), and is there a way to get around it?

我正在读这本书 - "Core Python Programming",我真的觉得这很好。但是当我在研究主题继承时,我对此感到困惑。

这本书说 - 我们可以使用super()来调用super class method,它将为我们找到基类方法,而且我们也不需要明确地传递self,就像我们没有超级..

以下是示例代码: -

# Invoking super class method without super() .. Need to pass `self` as argument
class Child(Parent):
    def foo(self):
        Parent.foo(self)

# Invoking with super().
# No need to pass `self` as argument to foo()
class Child(Parent1, Parent2):
    def foo(self):
        super(Child, self).foo()
        print 'Hi, I am Child-foo()'

我的问题是 - 为什么我们必须将classname传递给super()调用..因为类名可以从调用super的类中推断出来。

所以,因为调用了super() class Child,classname应该隐含在那里..那么为什么我们需要那个?

*编辑: - 将Child作为参数提供给super()没有意义,因为它没有提供任何信息..我们可以使用super(self) ..而且方法将按照在括号内给出的顺序在超类中搜索..

1 个答案:

答案 0 :(得分:4)

通过提供类名作为第一个参数,您可以提供冗余信息。是。这有点愚蠢*这就是为什么在Python 3中改变了super的行为。

*我的答案实际上与John Carter的答案相矛盾。当然,我们中只有一个是对的。我不想冒犯他和其他人,我很高兴看到一个有意义的例子super(C, self).method(arg)实际上没有在班级C中使用: - )。