我理解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
提出什么论点,我都无法解决这个问题。适当的论点是什么?
谢谢。
答案 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)