调用 super 的 init 时 Python 中的最大递归深度错误。
Maximum recursion depth error in Python when calling super's init.
我有一个 class 层次结构 A <- B <- C,在 B 中,我需要在构造函数中进行一些处理,所以我从这个 post 中得出了这段代码:Understanding Python super() with __init__() methods
#!/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
但是,我遇到了超出最大递归的运行时错误
File "evenmore.py", line 12, in __init__
super(self.__class__, self).__init__(v, v2)
RuntimeError: maximum recursion depth exceeded while calling a Python object
可能出了什么问题?
将 super 的第一个参数作为 class 名称可以解决此问题。
class B(A):
def __init__(self, v, v2):
# Do some processing
super(B, self).__init__(v, v2)
首先要考虑的是:C 从 B 继承了构造函数(因为它没有在 C 中定义)。
要考虑的第二件事:
self.__class__
in __init__
C 中的调用 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__
的第一个参数的类型为 C
。 super(self.__class__, self).__init__(v, v2)
再次解析为 B.__init__(self, v, v2)
.
- 一次又一次。还有你的无限递归。
我有一个 class 层次结构 A <- B <- C,在 B 中,我需要在构造函数中进行一些处理,所以我从这个 post 中得出了这段代码:Understanding Python super() with __init__() methods
#!/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
但是,我遇到了超出最大递归的运行时错误
File "evenmore.py", line 12, in __init__
super(self.__class__, self).__init__(v, v2)
RuntimeError: maximum recursion depth exceeded while calling a Python object
可能出了什么问题?
将 super 的第一个参数作为 class 名称可以解决此问题。
class B(A):
def __init__(self, v, v2):
# Do some processing
super(B, self).__init__(v, v2)
首先要考虑的是:C 从 B 继承了构造函数(因为它没有在 C 中定义)。
要考虑的第二件事:
self.__class__
in __init__
C 中的调用 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__
的第一个参数的类型为C
。super(self.__class__, self).__init__(v, v2)
再次解析为B.__init__(self, v, v2)
. - 一次又一次。还有你的无限递归。