调用super的init时Python中的最大递归深度错误。

时间:2015-09-28 20:22:01

标签: python recursion hierarchy superclass

我有一个类层次结构A< -B< - C,在B中,我需要在构造函数中进行一些处理,所以我从这篇文章中得到了这段代码: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

可能出现什么问题?

2 个答案:

答案 0 :(得分:7)

首先要考虑的是:C从B继承构造函数(因为它没有在C中定义)。

要考虑的第二件事: C类中self.__class__调用中的__init__是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)
  • 又一次又一次。还有你的无限递归。

答案 1 :(得分:2)

将super的第一个参数作为类名解决了这个问题。

<section class="hero">
    <div class="content">
        <div class="image-cropper">
            <img class="my-picture" src="http://imageweb-cdn.magnoliasoft.net/bridgeman/supersize/xir245162.jpg" alt="This is a picture of me">
        </div>
        <p class="iama">My name is...</p>
        <p class="my-name my-info">Jason Brain</p>
        <p class="iama">I want to be (eventually)...</p>
        <p class="my-info">A front end, full stack, and iOS developer</p>
    </div>
</section>