2011-03-15 56 views
1

我想寫一個遞歸算法來生成一個類的繼承層次結構的依賴關係樹。以下是我的示例代碼。我遇到的問題是,當我們基礎列表中的元素不止一個時,只有列表的第一個元素和它的父類被打印出來。生成繼承層次的依賴關係樹

def get_bases(klass): 
    bases = getattr(klass, '__bases__') 
    if len(bases) == 0: 
     return None 
    else: 
     for item in bases: 
     print item 
     return get_bases(item) 

我也想生成某種圖形顯示繼承層次結構。請幫助!

回答

4

的問題是在這裏:

for item in bases: 
    print item 
    return get_bases(item) 

你遞歸到該項目,然後立即返回不通過持續循環。你可以像更換:

for item in bases: 
    print item 
    get_bases(item) 

,或者你也許可以建立一個樹狀結構,而不是在以後打印(pprint_node顯示一個可能的實現):

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

def get_class_tree(klass): 
    bases = getattr(klass, '__bases__') 
    return Node(klass, [get_class_tree(item) for item in bases]) 

def pprint_node(node, level=0): 
    print (" "*level) + str(node.item) 
    for child in node.children: 
     pprint_node(child, level+1) 
+0

感謝@Owen,我希望「節點變形點焊'在運行get_class_tree方法之後應該是'class Node',我如何打印出由此方法生成的樹結構? – shaz 2011-03-15 20:13:11

+0

是的,它應該是上課。固定。還添加了一個非常簡單的打印方法,您可以從頭開始。 – 2011-03-18 17:08:15