2017-09-30 8 views
-2

私の質問は多少混乱していますが、私は自分自身を明確にするために最善を尽くします。ネストされたサブクラスが互いに親として存在するかどうかを再帰的に確認する方法はありますか?

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のインスタンスを持つことができます。この例では、各親アドレスが存在する場合は、それを印刷するだけです。

EDIT:

は受け入れ答えを考えると、それは私が私が望んで達成した方法は次のとおりです。

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

あなたは正確に何を確認していますか?最古の祖先? – schwobaseggl

+0

最後に、実際に。私は上から下へ、それぞれが存在するかどうかを調べ、それが終わりのときに停止したい。 –

+0

"y"はN個の親を持つことができます。私はどれくらいか分からない、それはユーザーに依存する。 yに1000の親があれば、それらのすべてにアクセスしてそれらが存在するかどうかを調べる必要があります。 –

答えて

2

以下は、メモリアドレスの印刷を行います。

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

あなたの祖先は、円を持つことができる場合、あなたは無限の再帰を避けるために、再帰呼び出しの下に設定し、それぞれの親とパスを収集する必要があると思います。

2

ループを使用するだけで、親のスタックが大きくなりすぎると実行時エラーを回避できます。

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

非再帰的なものは間違いなく良いアプラックです。実際には 'p':'は必要ありませんが、top.parentはNoneではありません:top = top.parent'は2行を保存します。 – schwobaseggl

関連する問題