python中超级方法的奇怪错误?

时间:2015-08-06 03:16:32

标签: python python-2.7 oop inheritance

我理解super应该用于在子类中启动超类。当我尝试在以下代码中执行它时,我不明白为什么它是一个问题:

class A:
    v = 3
    def __init__(self, g):
        self.g = g

class B(A):  

    def __init__(self, w):
        self.g = 7
        super().__init__(80)

然后,在shell中,我尝试以下方法:

r = B(90)

但是,它会抛出错误:

    super().__init__(80)
TypeError: super() takes at least 1 argument (0 given)

所以我尝试将该行修改为以下内容:

super(A).__init__(80)

但当然,这也会引发错误:

 super(A).__init__(80)
TypeError: must be type, not classobj

事实上,无论我为super提出什么论点,我都无法解决这个问题。适当的论点是什么?

谢谢。

2 个答案:

答案 0 :(得分:1)

super的零参数形式(即super())仅在Python 3中可用。在Python 2中,您必须使用显式形式,在本例中为super(B, self)。请参阅the documentation

由于它是Python 2,您还需要通过定义class A(object)使您的类成为新式。

答案 1 :(得分:1)

您无法在旧式课程中使用super。在Python 2中,classes that don't inherit from object are old style(这种区别在Python 3中已经消失了。)

其次,您应该将类​​(B)和实例(self)都传递给调用实例方法。

class A(object):  # note object here
    def __init__(self, g):
        self.g = g

class B(A):
    def __init__(self):
        super(B, self).__init__(80)

B()  # works

如果要使用旧样式类并调用父类,请直接引用它。您应该避免使用旧样式类。

class B(A):  # where A doesn't inherit object
    def __init__(self):
        A.__init__(self, 80)