创建基本的简单树
Posted
技术标签:
【中文标题】创建基本的简单树【英文标题】:Creating the basic simple Tree 【发布时间】:2021-12-19 07:40:53 【问题描述】:我正在创建创建节点及其子节点的基本树。但是在使用 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)
,因为我借用了这个打印声明。
【问题讨论】:
您正在附加TreeNode.data
,它不是树节点,所以它是__str__
不采用level=0
参数,不应将__str__
定义为放在第一位
【参考方案1】:
您的addchildren
方法已损坏,应将TreeNode
添加到self.children
,而不是TreeNode.data
:
def addchildren(self,TreeNode):
self.children.append(TreeNode)
TypeError
是由ret += child.__str__(level+1)
引起的,如果self.children
中的每个子节点也是TreeNode
类的实例,则它意味着递归打印子节点。但它失败并导致TypeError
,因为TreeNode.data
被添加为孩子之一。
正如错误消息TypeError: expected 0 arguments, got 1
所示,它试图为TreeNode.data
调用__str__
方法,这是内置类str
的一个实例,默认情况下不带任何参数。因为用户自定义类TreeNode
的__str__
方法被覆盖了,但是内置的str
类没有。
因此它与调用'Cold'.__str__(level+1)
相同,默认情况下不期望任何参数。
object.str(自我) 由 str(object) 和内置函数 format() 和 print() 调用,以计算对象的“非正式”或可良好打印的字符串表示。返回值必须是字符串对象。 -- Python3 Reference
注意self
不算作参数(至少不在错误消息中),它只是一个约定,每个类方法需要将对象的引用作为参数中的第一个列表。
【讨论】:
知道了。请解释 def __str__() 方法,尤其是。 child.__str__(level+1)。为什么它会抛出这个拼写错误? 查看上面修改后的答案。以上是关于创建基本的简单树的主要内容,如果未能解决你的问题,请参考以下文章