Maximum recursion depth error in Python when calling super's init.
本问题已经有最佳答案,请猛点这里访问。
我有一个类层次结构a<-b<-c,在b中,我需要在构造函数中进行一些处理,所以我从本文中提出了以下代码:用uuInit_uuuuuuuuuuux()方法理解python super()。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!/usr/bin/python class A(object): def __init__(self, v, v2): self.v = v self.v2 = v2 class B(A): def __init__(self, v, v2): # Do some processing super(self.__class__, self).__init__(v, v2) class C(B): def hello(): print v, v2 b = B(3, 5) print b.v print b.v2 c = C(1,2) print c |
但是,我有一个超过最大递归的运行时错误
1 2 3 | File"evenmore.py", line 12, in __init__ super(self.__class__, self).__init__(v, v2) RuntimeError: maximum recursion depth exceeded while calling a Python object |
可能有什么问题?
首先要考虑的是:C从B继承构造函数(因为它没有在C中定义)。
第二件事要考虑:在
让我们分析:
C().__init__ 呼叫super(self.__class__, self).__init__(v, v2) 决定super(C, self).__init__(v, v2) ,意思是B.__init__(self, v, v2) 。- 传递给
B.__init__ 的第一个参数的类型是C 。super(self.__class__, self).__init__(v, v2) 再次被决议为B.__init__(self, v, v2) 。 - 一次又一次。还有你的无限递归。
将super的第一个参数作为类名来解决这个问题。
1 2 3 4 | class B(A): def __init__(self, v, v2): # Do some processing super(B, self).__init__(v, v2) |