创建基本的简单树
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 ] 方法需要放在参数列表中的第一个。
我正在创建创建节点及其子节点的基本树。但是在使用 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 ] 方法需要放在参数列表中的第一个。