创建基本的简单树

Creating the basic simple Tree

我正在创建创建节点及其子节点的基本树。但是在使用 print() 语句时出现错误,即 __ str __( ) 在下面的代码中打印出树布局。

class TreeNode:
    def __init__(self,data,children = []):
        self.data = data
        self.children = children
    

    def __str__(self,level=0):
        ret = " " * level + str(self.data) + '\n'
        for child in self.children:
           ret += child.__str__(level+1)
    
        return ret

    # adding the children to the tree node
    def addchildren(self,TreeNode):
        self.children.append(TreeNode.data)

drinks = TreeNode('Drinks',[])
cold = TreeNode('Cold',[])
hot = TreeNode('Hot',[])
cola = TreeNode('Cola',[])
cappucino = TreeNode('Cappucino',[])
drinks.addchildren(cold)
drinks.addchildren(hot)
cold.addchildren(cola)
hot.addchildren(cappucino)

print(drinks)

TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_944/4195955341.py in <module>
----> 1 print(drinks)

~\AppData\Local\Temp/ipykernel_944/3676504849.py in __str__(self, level)
      8         ret = " " * level + str(self.data) + '\n'
      9         for child in self.children:
---> 10             ret += child.__str__(level+1)
     11 
     12         return ret

TypeError: expected 0 arguments, got 1

为什么会抛出这个 TypeError?解决方案是什么? 我期待这个:

Drinks
 Cold
  Cola
 Hot
  Cappucino

还有一件事,还请解释一下 def __str__(self,level=0): 方法,特别是 child.__str__(level_1) 因为我借用了这个打印语句。

您的 addchildren 方法已损坏,它应该将 TreeNode 添加到 self.children,而不是 TreeNode.data:

def addchildren(self,TreeNode):
        self.children.append(TreeNode)

TypeError是由ret += child.__str__(level+1)引起的,意思是如果self.children中的每个child也是一个实例,则递归打印child节点class TreeNode 个。但它失败并导致 TypeError 因为 TreeNode.data 被添加为 children 之一。

如错误消息 TypeError: expected 0 arguments, got 1 所示,它试图为 TreeNode.data 调用 __str__ 方法,build-in class [=24] 的一个实例=], 默认情况下不带任何参数。因为 user-defined class TreeNode__str__ 方法被覆盖了,但是 build-in str class 没有被覆盖。

因此它与调用 'Cold'.__str__(level+1) 相同,默认情况下不需要任何参数。

object.str(self) Called by str(object) and the built-in functions format() and print() to compute the “informal” or nicely printable string representation of an object. The return value must be a string object. -- Python3 Reference

请注意,self 不算作参数(至少在错误消息中不算),它只是一个约定,每个 class 都引用 object ] 方法需要放在参数列表中的第一个。