我知道我的问题有些令人困惑,但我会尽力使自己清楚。这是我尝试说明问题的示例代码:
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,这与嵌套面板(布局管理)有关。我不知道面板是如何嵌套的。
答案 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)