如何递归检查嵌套的子类是否彼此作为父类?

时间:2017-09-30 17:54:00

标签: python python-3.x recursion

我知道我的问题有些令人困惑,但我会尽力使自己清楚。这是我尝试说明问题的示例代码:

class X:

  def __init__(self, p=None):
    self.parent = p

class Y(X):

  def __init__(self, p=None):
    X.__init__(self, p)

  def recursive_check(self):
    if (self.parent.parent.parent):
      print(self.parent.parent.parent)

x0 = X()
x1 = X(x0)
x2 = X(x1)
y = Y(x2)
y.recursive_check()

如您所见,如果您尝试访问self.parent.parent.parent.parent,您将获得无。问题是我不知道父母是如何嵌套的,所以我无法直接测试他们是否存在。我想以递归方式检查嵌套的深度,它可以有100个实例相互嵌套。为了这个例子,我只需要打印每个父地址(如果存在)。

编辑:

考虑到已接受的答案,那就是我如何实现我想要的目标:

class X:

  def __init__(self, p=None):
    self.parent = p

  def recursive_check(self):
    if self.parent:
        print(self.parent)
        self.parent.recursive_check()

class Y(X):

  def __init__(self, p=None):
    X.__init__(self, p)

x0 = X()
x1 = X(x0)
x2 = X(x1)
y = Y(x2)
y.recursive_check()
OBS:我正在为Pygame开发GUI,这与嵌套面板(布局管理)有关。我不知道面板是如何嵌套的。

2 个答案:

答案 0 :(得分:2)

以下将进行内存地址打印:

def recursive_check(self):
    if self.parent:
        print(id(self.parent))
        self.parent.recursive_check()

如果您的祖先可以拥有圆圈,则必须收集每个父级并在递归调用上传递该集合,以避免无限递归。

答案 1 :(得分:2)

只需使用一个循环,这可以避免父项堆栈过大时的运行时错误。

def recursive_check(self):
    top = self
    p = self.parent
    while p is not None:
        top = p
        p = top.parent
    print(top)