调用super的init时python中的最大递归深度错误Maximum recursion depth error

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中定义)。

第二件事要考虑:在__init__中,c类中的self.__class__调用是c,而不是b。

让我们分析:

  • C().__init__呼叫super(self.__class__, self).__init__(v, v2)决定super(C, self).__init__(v, v2),意思是B.__init__(self, v, v2)
  • 传递给B.__init__的第一个参数的类型是Csuper(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)