2012-08-16 85 views
0

我需要將某些數據表示爲層次結構,其中的對象可以有一個父項和多個子項。我也需要能夠像孩子那樣得到一個孩子的父母。表示雙向遍歷層次結構的最佳方式

我想這

class Root(): 
    def __init__(self): 
     self.child = Node(self) 

class Node(): 
    def __init__(self, parent): 
     self.parent = parent 

是否有解決這一問題在那裏

回答

7

我認爲這基本上是如何Tkinter做它的常見方式:現在

class Root(object): 
    def __init__(self): 
     self.children = [] 

class Node(object): 
    def __init__(self,parent): 
     self.parent = parent 
     parent.children.append(self) 

Root通過children屬性知道所有的孩子,孩子們通過parent attri知道他們的父母弼。

r = Root() 
n = Node(r) 
r.children[0] is n #True 
n.parent is r #True 

當然,你可以讓事情變得更有趣通過給Node對象一個children屬性,以及 - 然後Node S能夠更父Node秒。整齊。

這裏有一些缺點(主要是循環引用)。如果你想避免這種情況,你可以使用weakref.ref來存儲對孩子/父母的引用,但如果有必要,我會推遲到另一個問題。

+0

我也是這麼做的。循環引用可能是一個問題,如果你在遞歸子程序中以編程方式遍歷樹,但是有一些方法可以解決這個問題(路徑追蹤是這種事情的強力選擇)。但是,能夠回看樹的一個好處是能夠擁有一個返回從根節點到該節點的路徑的child.path()方法。 – Adrian 2012-08-16 01:09:22

+0

另外,您可以在沒有Root對象的情況下執行此操作。如果您只是使用Node對象,並將None傳遞給根節點對象的父參數,則應該達到相同的效果。 – Adrian 2012-08-16 01:15:36

+0

@Adrian - 是的。我只保留了一個'Root'對象,因爲OP有。但是你是對的,如果'Node'同時具有'children'和'parent'屬性,'Root'對象是不必要的。 – mgilson 2012-08-16 01:16:55